在 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
对于X
和Y
列的每种组合,我想按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
开始尝试,您可以接近您的正在寻找 xtabs
和 ftable
的组合。但是,结果将包括所有因子水平
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 中按组转置数据的主要内容,如果未能解决你的问题,请参考以下文章