2017-10-19 28 views
0

我已经工作的处理,以创建用于长度1:n唯一整数的所有可能的组合中选择列/行的元件。我发现了nCr函数(combinat包中的combn函数在这里很有用)。使用从一个表中作为R

一旦所有独特出现被重复,它们被附加到包含任何可能的长度+组合的数字1:n一个合并表。最后的表的相应列(一个记录)的一个子集是这样的(列名为字符串和集表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)] 
+1

你能提供'$ F1的String'的输出? – ANG

+0

请提供一个可重复的例子。 –

+0

F1 $串的输出为:c(1,3,4,5,9,10) – Anton89

回答

0

f1$String是字符串"c(1, 3, 4, 5, 9, 10)"。当您使用myMat[,(f1$String)]时,R将查找名称为“c(1,3,4,5,9,10)”的列。要获得列编号1,3,4,5,9,10,你必须分析字符串到R的表达和第一评价它:

myMat[,eval(parse(text=f1$String))]

+0

那伟大的工作重复性代码,谢谢! – Anton89

+0

它工作正常。在这里使用'eval()'时应该小心。尝试这一点,看看结果'x < - c(“1”,“3”,“4”,“5”,“9”,“10”)' 'eval(parse(text = x))' – ANG

+0

在这种情况下,你可以使用'sapply(x,function(y)eval(parse(text = y)))''。 – user3794498

0

正如@ user3794498注意到,您设置f1$Stringas.character()所以你不能用是得到你想要的列。 您可以更改定义方式f1或从f1$String中提取列号。像这样的东西也应该工作(之前加载stringrmyMat[, f1$String %>% str_match_all("[0-9]+") %>% unlist %>% as.numeric]

相关问题