R:使用多个m实现combn函数并定义输出变量

R:使用多个m实现combn函数并定义输出变量,r,combn,R,Combn,我使用下面的代码来获得名称以“form”开头的变量的所有可能组合(m=2)的平均值 代码运行良好,我正在尝试实现它,以便将所有可能与m的组合从2到8。我试过下面的代码,但不起作用 x<-2:8 k=which(grepl("^form",colnames(data))) combined <- combn(data[,k], seq_along(x), FUN = rowMeans) colnames(combined) <- combn(names(data[,k]), se

我使用下面的代码来获得名称以“form”开头的变量的所有可能组合(m=2)的平均值

代码运行良好,我正在尝试实现它,以便将所有可能与m的组合从2到8。我试过下面的代码,但不起作用

x<-2:8
k=which(grepl("^form",colnames(data)))
combined <- combn(data[,k], seq_along(x), FUN = rowMeans)
colnames(combined) <- combn(names(data[,k]), seq_along(x), paste0, collapse="")
data <- cbind(data, combined)

x函数
combn
只能取1个元素作为组合数,因此您需要使用lapply并最终将其与do.call(cbind..)组合:

首先,我们定义组合x的函数:

func = function(x,DATA){
mat = combn(DATA,x,FUN=rowMeans)
colnames(mat) = combn(names(DATA),x, paste0, collapse="")
mat
}
然后我们迭代:

k=which(grepl("^form",colnames(data)))
combined = lapply(2:8,func,DATA=data[,k])
combined <- do.call(cbind, combined)

函数
combn
,对于组合的数量只能取1个元素,因此您需要使用lappy并最终将它们与do.call(cbind..)组合:

首先,我们定义组合x的函数:

func = function(x,DATA){
mat = combn(DATA,x,FUN=rowMeans)
colnames(mat) = combn(names(DATA),x, paste0, collapse="")
mat
}
然后我们迭代:

k=which(grepl("^form",colnames(data)))
combined = lapply(2:8,func,DATA=data[,k])
combined <- do.call(cbind, combined)

原因很简单,
combn
一次只取一个
m
。只需使用
sapply
m
s上迭代即可。为了在一个步骤中获得列名,我们可以使用
'colnames,原因很简单,
combn
一次只取一个
m
。只需使用
sapply
m
s上迭代即可。为了在一个步骤中获得列名,我们可以使用
'colnames您需要在
m上进行迭代。您需要在
m上进行迭代。当您的代码出现错误时,包含错误的逐字文本非常有帮助。如果您得到的结果与数据或您的期望不一致,那么将输出、错误原因和预期输出包括在内是很有帮助的。由于我们没有您的
数据
(顺便说一句,将其用作变量名是不好的做法),因此很难在本地复制任何内容。谢谢您!我已经按照你的建议编辑了这篇文章!当代码出现错误时,包含错误的逐字文本非常有用。如果您得到的结果与数据或您的期望不一致,那么将输出、错误原因和预期输出包括在内是很有帮助的。由于我们没有您的
数据
(顺便说一句,将其用作变量名是不好的做法),因此很难在本地复制任何内容。谢谢您!我已经按照你的建议编辑了这篇文章!
k=which(grepl("^form",colnames(data)))
combined = lapply(2:8,func,DATA=data[,k])
combined <- do.call(cbind, combined)
library(purrr)
library(dplyr)

combined = 2:8 %>% map(~as.tibble(func(.x,DATA=data[,k]))) %>% bind_cols()
k <- 2:14
combined.2.lst <- sapply(2:8, function(m) 
  `colnames<-`(combn(data[,k], m, rowMeans),
                 combn(names(data[,k]), m, function(x) 
                         paste0("comb.", paste0(gsub("form", "", x), collapse=".")))))
combined.2 <- do.call(cbind, combined.2.lst)
dim(combined.2)
# [1]   19 7085
combined.2[1:5, c(1, 50, 100, 500, 1000, 5000)]  # example columns
#      comb.13.12 comb.9.1 comb.13.10.9 comb.13.10.2.1 comb.9.5.4.3 comb.13.7.6.5.4.3.2
# [1,]   1315.207 1223.424     1207.833       1453.540     1313.488            1458.356
# [2,]   1117.319 1080.482     1058.291       1271.948     1134.727            1258.836
# [3,]   1282.016 1227.391     1220.311       1447.414     1323.304            1448.835
# [4,]   1340.518 1295.056     1299.926       1522.909     1413.207            1528.446
# [5,]   1223.082 1197.812     1192.932       1404.447     1288.278            1400.515
m <- 2:8
k=which(grepl("^form",colnames(data)))
combined <- Reduce(cbind,lapply(m, function(m) combn(data[,k], m, FUN = rowMeans)))
colnames(combined) <-unlist(sapply(m, function(m) combn(names(data[,k]), m, paste0, collapse=""))) 
data <- cbind(data, combined)