我一直致力于为长度1:n
创建所有可能的唯一整数组合的过程。我找到了nCr
函数(combinat包中的combn函数在这里很有用)。
迭代完所有唯一匹配后,它们将附加到合并表中,该合并表包含任何可能的长度+数字组合1:n
。最终表的相关列(一个记录)的子集看起来像这样(列名为String,子集表f1
):
c(1,3,4,5,9,10)
我需要一次从一个辅助数据源(df
)中选择这些列(我将循环遍历此表),所以我的逻辑是使用此代码:
df[,f1$String]
但是,我收到一条消息,指出已选择未定义的列,但如果我复制并粘贴单元格的内容,例如:
df[,c(1, 3, 4, 5, 9, 10)]
它工作得很好......我已经尝试了所有我能想到的;如果有人有一些见解,将不胜感激。
要重现的代码是:
library(combinat)
library(data.table)
library(plyr)
rm(list=ls())
NCols=10
NRows=10
myMat<-matrix(runif(NCols*NRows), ncol=NCols)
XVars <- as.data.frame(myMat)
colnames(XVars) <- c("a","b","c","d","e","f","g","h","i","j")
x1 <- as.data.frame(colnames(XVars[1:ncol(XVars)]))
colnames(x1) <- "Independent.Variable"
setDT(x1)[, Index := .GRP, by = "Independent.Variable"]
colClasses = c("character", "numeric", "numeric")
col.names = c("String", "r!", "n!")
Combination <- read.table(text = "", colClasses = colClasses, col.names = col.names)
for(i in 1:nrow(x1)){
x2<- as.data.frame(combn(nrow(x1),i))
for (i in 1:ncol(x2)){
x3 <- paste("c(",paste(x2[1:nrow(x2),i], collapse = ", "), ")", sep="")
x3 <- as.data.frame(x3)
colnames(x3) <- "String"
x3 <- mutate(x3, "r!" = nrow(x2))
x3 <- mutate(x3, "n!" = nrow(x1))
Combination <- rbind(Combination, x3)
}
}
setDT(Combination)[, Index := .GRP, by = c("String", "r!", "n!")]
f1 <- Combination[717,]
f1$String <- as.character(f1$String)
## reference to data frame
myMat[,(f1$String)]
## pasted element
myMat[, c(1, 3, 4, 5, 9, 10)]
答案 0 :(得分:0)
f1$String
是字符串"c(1, 3, 4, 5, 9, 10)"
。当您使用myMat[,(f1$String)]
时,R将查找名称为&#34; c(1,3,4,5,9,10)&#34;的列。要获得列号1,3,4,5,9,10,您必须将字符串解析为R表达式并首先对其进行求值:
myMat[,eval(parse(text=f1$String))]
答案 1 :(得分:0)
正如@ user3794498注意到的那样,您设置了someBooleanMethod
f1$String
,因此您无法使用is来获取所需的列。
您可以更改定义as.character()
的方式或从f1
中提取列号。这样的事情也应该有效(在f1$String
之前加载stringr
)。