R中的水平到垂直格式

时间:2016-10-10 20:53:16

标签: r dataframe

我有一个包含这些值的数据框:

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?

中实现这一目标

3 个答案:

答案 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