我想选择数据框中存储在字符串变量中的所有列。例如:
v1 <- rnorm(100)
v2 <- rnorm(100)
v3 <- rnorm(100)
df <- data.frame(v1,v2,v3)
我想完成以下任务:
df[,c('v1','v2')]
但我想使用变量而不是(c('v1','v2'))(这些都失败了):
select.me <- "'v1','v2'"
df[,select.me]
df[,c(select.me)]
df[,c(paste(select.me,sep=''))]
感谢您提供一个简单问题的帮助,
答案 0 :(得分:16)
这里的讽刺是,当你说“我想这样做”时,第一个表达式应该成功,
df[,c('v1','v2')]
> str( df[,c('v1','v2')] )
'data.frame': 100 obs. of 2 variables:
$ v1: num -0.3347 0.2113 0.9775 -0.0151 -1.8544 ...
$ v2: num -1.396 -0.95 -1.254 0.822 0.141 ...
而所有后来的尝试都会失败。我后来意识到你不知道你可以使用select.me <- c('v1','v2') ; df[ , select.me]
。您也可以使用这些在某些情况下可能更安全的表单:
df[ , names(df) %in% select.me] # logical indexing
df[ , grep(select.me, names(df) ) ] # numeric indexing
df[ , grepl(select.me, names(df) ) ] # logical indexing
其中任何一个都可以用于否定(!logical
)或减号(-numeric
)来检索补语,而不能使用带有否定的字符索引。如果您希望在可理解性方面达到一个级别,并且愿意将select.me
值更改为有效的R表达式,则可以执行此操作:
select.me <- "c('v1','v2')"
df[ , eval(parse(text=select.me)) ]
不是我推荐这个......只是为了让你知道在你“学会走路”之后这样做是可能的。也可能(虽然相当巴洛克式)使用你原来的引用字符串来提取信息(虽然我认为这只能说明为什么你的第一个版本更优秀):
select.me <- "'v1','v2'"
df [ , scan(textConnection(select.me), what="", sep=",") ]
> str( df [ , scan(textConnection(select.me), what="", sep=",") ] )
Read 2 items
'data.frame': 100 obs. of 2 variables:
$ v1: num -0.3347 0.2113 0.9775 -0.0151 -1.8544 ...
$ v2: num -1.396 -0.95 -1.254 0.822 0.141 ...
答案 1 :(得分:5)
这是基本的R
语法,您可能需要阅读introductory manual
select.me <- c('v1','v2')
df[,select.me]
答案 2 :(得分:0)
dat <- cbind(df$v1, df$v2)