【问题标题】:How to calculate row mean from selected columns如何从选定的列计算行平均值
【发布时间】:2022-01-08 02:48:26
【问题描述】:

我有一个如下所示的数据框:

data <- as.data.frame(cbind('01-01-2018' = c(1.2,3.1,0.7,-0.3,2.0), '02-01-2018' = c(-0.1, 2.4, 4.9,-3.3,-2.7), '03-01-2018' = c(3.4, -2.6, -1.8, 0.1, 0.3)))

  01-01-2018  02-01-2018  03-01-2018
1      1.2       -0.1        3.4
2      3.1        2.4       -2.6
3      0.7        4.9       -1.8
4     -0.3       -3.3        0.1
5      2.0       -2.7        0.3

我想仅考虑超过总行均值的列来计算行均值。

data$mn <- apply(data, 1, mean) 

  01-01-2018 02-01-2018 03-01-2018         mn
1        1.2       -0.1        3.4  1.5000000
2        3.1        2.4       -2.6  0.9666667
3        0.7        4.9       -1.8  1.2666667
4       -0.3       -3.3        0.1 -1.1666667
5        2.0       -2.7        0.3 -0.1333333

换句话说,对于每一行,我想计算超过data$mn的值的平均值。

我最后一次尝试是:

data$mintensity <- apply(data, 1, function(x) mean(x[x > data$mn]) ) 

但没有成功。

【问题讨论】:

    标签: r row apply average


    【解决方案1】:

    在计算它们的平均值之前,只需在各自的行 w 中按它们的平均值对每一行进行子集。

    w <- c("01-01-2018", "02-01-2018", "03-01-2018")  ## define columns
    
    apply(data[, w], 1, function(x) mean(x[x > mean(x)]))
    # [1]  3.40  2.75  4.90 -0.10  1.15
    

    另一种方法是在计算rowMeans 之前使用NA's 对不超过行均值的replace 数据点进行处理。这大约快 30 倍

    rowMeans(replace(data, data <= rowMeans(data[, w]), NA), na.rm=TRUE)
    # [1]  3.40  2.75  4.90 -0.10  1.15
    

    数据:

    data <- structure(list(`01-01-2018` = c(1.2, 3.1, 0.7, -0.3, 2), `02-01-2018` = c(-0.1, 
    2.4, 4.9, -3.3, -2.7), `03-01-2018` = c(3.4, -2.6, -1.8, 0.1, 
    0.3)), class = "data.frame", row.names = c(NA, -5L))
    

    【讨论】:

    • 是的,好的。但是,我必须将同一行也应用于其他两列,它们不是 = data$mn 并且不能用像 mean(x) 这样的简单公式合成
    • @nflore 请查看更新。
    猜你喜欢
    • 2016-10-13
    • 1970-01-01
    • 2019-04-03
    • 2011-03-08
    • 1970-01-01
    • 2021-10-08
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多