【问题标题】:R + reshape : variance of columns of a data.frameR + reshape : data.frame 列的方差
【发布时间】:2010-07-28 19:56:41
【问题描述】:

我在 R 中使用 reshape 来计算 data.frame 列的聚合统计信息。这是我的data.frame:

> df
  a a b b ID
1 1 1 1 1  1
2 2 3 2 3  2
3 3 5 3 5  3

这只是一个小测试 data.frame 来尝试理解 reshape 包。我融化,然后施放,试图找出as 和bs 的平均值:

> melt(df, id = "ID") -> df.m
> cast(df.m, ID ~ variable, fun = mean)
  ID a b
1  1 1 1
2  2 2 2
3  3 3 3

啊!什么?希望c(2,3) 的平均值是 2.5,依此类推。这是怎么回事?事情是这样的:

> df.m
   ID variable value
1   1        a     1
2   2        a     2
3   3        a     3
4   1        a     1
5   2        a     2
6   3        a     3
7   1        b     1
8   2        b     2
9   3        b     3
10  1        b     1
11  2        b     2
12  3        b     3

发生了什么事?我的5s 都去哪儿了?我在这里有一个非常基本的误解吗?如果是这样:它是什么?

【问题讨论】:

    标签: r dataframe reshape


    【解决方案1】:

    这不是一个有效的数据框,因为列没有唯一的名称。

    【讨论】:

    • 不知道我可以创建无效的 data.frames。
    【解决方案2】:

    我在这里更新了我的答案来解决这个问题: R: aggregate columns of a data.frame

    显然,如果您的数据框没有唯一的列名,它们将无法正确融合。

    编辑: 而不是a a a b b 的列名,显然您需要具有唯一的列名melt() 才能正常工作。最低限度a.1 a.2 a.3 b.1 b.2,或其他东西。使用melt() 后,您可以选择在variable 的级别上使用gsub() 来消除variable 的合理级别,或者使用colsplit() 创建两个新列。对于我刚刚给出的虚拟名称,它看起来像:

    levels(df.m$variable) <- gsub("\\..*", "", levels(df.m$variable))
    #or
    df.m <- cbind(df.m, colsplit(df.m$variable, split = "\\.", names = c("Measure","N")))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 2012-09-04
      • 1970-01-01
      相关资源
      最近更新 更多