我有一个数据帧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”中的前两个值,计算如下:
1
:1 / ((2 + 3 + 4 + 5) / 4)) = 0.2857143
2
:2 / ((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
非常感谢您的帮助!
答案 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