将值与列式“留一出”均值进行比较

时间:2017-09-23 19:54:33

标签: r

我有一个数据帧df:

df <- data.frame(a = 1:5, b = 6:10)

    a  b
1   1  6
2   2  7
3   3  8
4   4  9
5   5 10

对于每一列,我想将每个值除以列平均值,其中通过从平均值的计算中排除焦点值来计算平均值(“留一出”均值)。

例如,列“a”中的前两个值,计算如下:

  • 11 / ((2 + 3 + 4 + 5) / 4)) = 0.2857143
  • 22 / ((1 + 3 + 4 + 5) / 4)) = 0.6153846

“留一出意味着”:

    mean_a         mean_b
1   3.5            8.5
2   3.25           8.25
3   3              8
4   2.75           7.75
5   2.5            7.5

期望的结果:值/“留一出”意味着

    res_a          res_b
1   0.285          0.705
2   0.615          0.848
3   1              1
4   1.454          1.161
5   2              1.333

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

如果我理解正确,以下情况应该这样做。

res <- sapply(df, function(x)
    sapply(seq_along(x), function(i) x[i]/mean(x[-i]))
)
res <- as.data.frame(res)
names(res) <- paste("c", names(res), sep = "_")
res
#        c_a       c_b
#1 0.2857143 0.7058824
#2 0.6153846 0.8484848
#3 1.0000000 1.0000000
#4 1.4545455 1.1612903
#5 2.0000000 1.3333333

答案 1 :(得分:1)

只需在R

中使用索引和矢量的魔力
for(i in 1:nrow(df)){

  print(df$a[i]/mean(df$a[-i]))

}

我刚刚复制了a列。我希望你可以为B做这个并转换成数据帧。 如果您需要帮助,请告诉我。 很高兴帮助R。

答案 2 :(得分:0)

矢量化的可能性,对于更大的数据来说会更快。

df / ((rep(colSums(df), each = nrow(df)) - df) / (nrow(df) - 1))
#         a         b
# 0.2857143 0.7058824
# 0.6153846 0.8484848
# 1.0000000 1.0000000
# 1.4545455 1.1612903
# 2.0000000 1.3333333