我有一个包含这些值的数据框:
X1 X2 X3
s1 45.11 1
s1 45.13 1
s1 53.42 2
s1 51.41 2
s2 96.76 3
s2 96.65 3
s4 77.9 4
s1 80.46 5
s3 43.58 2
s1 43.12 2
s1 41.51 3
s4 41.97 3
s1 108.97 6
s3 117.46 6
s4 40 3
s4 40 3
s5 25.4 1
s5 25.5 1
我想将其转换为这种格式的数据框:
s1 s2 s3 s4 s5
1 45.12 0 0 0 25.45
2 49.32 0 43.58 0 0
在此,值是上面符合条件的X2
列的平均值,即行s1
的一部分,值X3
为1。
我如何在R?
中实现这一目标答案 0 :(得分:3)
您可以在基数R中执行此操作(假设您的数据位于数据框df
中):
r <- aggregate(X2~X1+X3, df[df$X3 %in% c(1,2),], mean)
round(t(xtabs(X2~X1+X3, r)), 2)
# X1
#X3 s1 s2 s3 s4 s5
# 1 45.12 0.00 0.00 0.00 25.45
# 2 49.32 0.00 43.58 0.00 0.00
答案 1 :(得分:1)
使用data.table
:
setDT(df)
df.mean <- df[, mean(X2), by = .(X1, X3)]
df.mean.wide <- dcast(df.mean, X3 ~ X1, value.var = "V1")
df.mean.wide[is.na(df.mean.wide)] <- 0
df.mean.wide[1:2]
X3 s1 s2 s3 s4 s5
1: 1 45.12000 0 0.00 0 25.45
2: 2 49.31667 0 43.58 0 0.00
答案 2 :(得分:1)
或者您可以使用较新的if (a[i])
和tidyr
个包。以下示例旨在分解两个步骤(#1总结您的数据;#2转换为宽格式):
dplyr