在表中选择R中的列/行时使用表中的元素

时间:2017-10-19 12:28:06

标签: r

我一直致力于为长度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)]

2 个答案:

答案 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)。