我有一个包含5个不同变量(例如a,b,c,d和e)的数据集。我想要一个简单的代码(最好使用tidyverse),使我能够对变量的每种可能组合取均值。例如,“ ab”,“ ac”,...的平均值一直到“ abcde”。有没有简单的方法可以做到这一点?
我所尝试的只是为每个变量手动创建代码。但是,看起来像循环这样的方法更合适。
例如,如果我的数据如下:
a <- rnorm(10, 0, 1)
b <- rnorm(10, 0, 1)
c <- rnorm(10, 0, 1)
d <- rnorm(10, 0, 1)
e <- rnorm(10, 0, 1)
data <- cbind.data.frame(a,b,c,d,e)
我希望数据看起来像输出,就像我对a,b,c,d,e的每种组合都这样做一样:
data$ab <- (data$a + data$b)/2
.
.
.
data$abcde <- (data$a + data$b + data$c + data$d + data$e)/5
答案 0 :(得分:4)
您可以使用combn
生成组合,并使用rowMeans
计算每个组合的均值:
all.combs <- unlist(lapply(2:ncol(data), function(x) combn(colnames(data), x, simplify = F)), recursive = F)
m <- lapply(all.combs, function(x) rowMeans(data[, x]))
data[sapply(all.combs, paste0, collapse = '')] <- m
# example output
data[, c('ab', 'ac', 'abcde')]
# ab ac abcde
# 1 0.9145668 -0.15422891 0.46534449
# 2 1.0593771 0.36834739 -0.28974715
# 3 0.8504790 0.37486041 0.58032864
# 4 0.8392725 1.67687954 0.62420232
# 5 -0.1612623 -0.31145576 0.06580884
# 6 -0.6140748 -0.05931374 -0.01082605
# 7 0.4424551 0.75504165 0.53706206
# 8 -0.1202238 -0.02772524 0.43865296
# 9 -1.3020701 -0.18290837 -0.61781512
# 10 -0.7414824 -1.56409902 -1.12516693