【问题标题】:How can I get the average (mean) of selected columns如何获得所选列的平均值(平均值)
【发布时间】:2012-03-18 10:18:01
【问题描述】:

我想获得每行某些列的平均值。

我有这些数据:

w=c(5,6,7,8)
x=c(1,2,3,4)
y=c(1,2,3)
length(y)=4
z=data.frame(w,x,y)

返回:

  w x  y
1 5 1  1
2 6 2  2
3 7 3  3
4 8 4 NA

我想获得某些列的平均值,而不是所有列。我的问题是我的数据中有很多 NA。因此,如果我想要 x 和 y 的平均值,这就是我想要返回的:

  w x  y mean
1 5 1  1    1
2 6 2  2    2
3 7 3  3    3
4 8 4 NA    4

我想我可以做类似z$mean=(z$x+z$y)/2 的操作,但 y 的最后一行是 NA,所以显然我不想计算 NA,我不应该除以 2。我尝试了cumsum,但是当该行中只有一个 NA 时,它会返回 NA。我想我正在寻找可以添加选定列、忽略 NA、获取没有 NA 的选定列数并除以该数字的东西。我试过 ??mean 和 ??average 并且完全被难住了。

ETA:还有一种方法可以为特定列添加权重吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    这里有一些例子:

    > z$mean <- rowMeans(subset(z, select = c(x, y)), na.rm = TRUE)
    > z
      w x  y mean
    1 5 1  1    1
    2 6 2  2    2
    3 7 3  3    3
    4 8 4 NA    4
    

    加权平均

    > z$y <- rev(z$y)
    > z
      w x  y mean
    1 5 1 NA    1
    2 6 2  3    2
    3 7 3  2    3
    4 8 4  1    4
    > 
    > weight <- c(1, 2) # x * 1/3 + y * 2/3
    > z$wmean <- apply(subset(z, select = c(x, y)), 1, function(d) weighted.mean(d, weight, na.rm = TRUE))
    > z
      w x  y mean    wmean
    1 5 1 NA    1 1.000000
    2 6 2  3    2 2.666667
    3 7 3  2    3 2.333333
    4 8 4  1    4 2.000000
    

    【讨论】:

    • 谢谢,这正是我想要的。我真的需要研究这个神奇的apply命令,它似乎是解决所有问题的方法。
    【解决方案2】:

    尝试使用rowMeans

    z$mean=rowMeans(z[,c("x", "y")], na.rm=TRUE)
    
      w x  y mean
    1 5 1  1    1
    2 6 2  2    2
    3 7 3  3    3
    4 8 4 NA    4
    

    【讨论】:

    • +1 谢谢,我通常使用 Extract,不敢相信我没有想到这一点。检查 kohske 是否包含加权的解决方案。
    • @andrew 如何获取具有特定名称的列范围的 rowMeans(例如 MGW.1、MGW.2、MGW.3 ... MGW.198)所以所有这些列都有名称以 MGW 开头,但数字不同,我不确定此类列的确切数量,在一种情况下它们可能是 196,在另一种情况下可能是 198。我想要的是这样的:data.frame(ID=DF[,1:4], MGW=rowMeans(DF[,MGW.*]), HEL=rowMeans(DF[,HEL.*])) 这意味着不应触及前 4 列,而其余列取 MGW.* 和 HEL.* 类别中所有列的平均值。
    • 为此,我建议使用 dplyr 和 tidyr,因为 dplyr 允许您根据正则表达式选择列。有关示例,请参阅 this question,或有关此问题的工作示例,请参阅 this gist
    • @Andrew 嗨,我要找出每 10 列数据(有 1000 列)的平均值,我应该如何修改它?你能指导我吗?谢谢 :)
    猜你喜欢
    • 1970-01-01
    • 2015-09-11
    • 2022-08-14
    • 2020-10-11
    • 2021-12-09
    • 2023-02-17
    • 2021-05-30
    • 1970-01-01
    相关资源
    最近更新 更多