在 R 中按组转置数据

Posted

技术标签:

【中文标题】在 R 中按组转置数据【英文标题】:Transpose data by groups in R 【发布时间】:2013-06-27 06:05:03 【问题描述】:

我有以下结构的数据:

x <- read.table(header=T, text="
X Y D S
a e 1 10
a e 2 20
a f 1 50
b c 1 40
b c 2 30
b c 3 60
b d 1 10 
b d 2 20")

我想得到以下结果:

X Y   1   2   3
a e  10  20
a f  50
b c  40  30  60
b d  10  20

对于XY 列的每种组合,我想按D 列中的顺序转置S 列中的数据。

我认为xtabs() 会起作用,但我不这么认为,我最好的版本是:

xtabs(formula=S~Y+D,data=x)

结果:

   D
Y    1  2  3
  c 40 30 60
  d 10 20  0
  e 10 20  0
  f 50  0  0

【问题讨论】:

【参考方案1】:

其他两个答案非常好,但就其价值而言,既然您提到您从 xtabs 开始尝试,您可以接近您的正在寻找 xtabsftable 的组合。但是,结果将包括所有因子水平

ftable(xtabs(S ~ ., x))
#     D  1  2  3
# X Y           
# a c    0  0  0
#   d    0  0  0
#   e   10 20  0
#   f   50  0  0
# b c   40 30 60
#   d   10 20  0
#   e    0  0  0
#   f    0  0  0

或者,您可以执行以下操作:

data.frame(unique(x[1:2]), 
           as.data.frame.matrix(xtabs(S ~ do.call(paste, x[1:2]) + D, x)))
#   X Y X1 X2 X3
# 1 a e 10 20  0
# 3 a f 50  0  0
# 4 b c 40 30 60
# 7 b d 10 20  0

【讨论】:

【参考方案2】:

基础 R 中的解决方案:

> reshape(x, timevar="D", idvar=c("X","Y"), direction="wide")
  X Y S.1 S.2 S.3
1 a e  10  20  NA
3 a f  50  NA  NA
4 b c  40  30  60
7 b d  10  20  NA

【讨论】:

【参考方案3】:
require(reshape2)
dcast(x, X + Y ~ D, value.var="S")

如果您想用0 而不是NA(这是默认值)填充空条目,那么,

dcast(x, X + Y ~ D, value.var="S", fill=0)

【讨论】:

以上是关于在 R 中按组转置数据的主要内容,如果未能解决你的问题,请参考以下文章

在许多单行数据中按组在 R 中进行相关测试 [关闭]

在R中按组应用滚动平均值

在R中按组计算日期之间的差异

在 R 中按组创建组合

如何在 R 的列表中按组获取平均值

R 提取最常见的单词)/ n 克在列中按组