【问题标题】:Subset dataframe with list of columns in R具有R中列列表的子集数据框
【发布时间】:2012-11-18 05:15:14
【问题描述】:

我想选择存储在字符串变量中的数据框中的所有列。例如:

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=''))]

感谢您对一个简单问题的帮助,

【问题讨论】:

    标签: string r dataframe


    【解决方案1】:

    这是基本的R sytnax,也许你需要阅读introductory manual

    select.me <- c('v1','v2')
    df[,select.me]
    

    【讨论】:

      【解决方案2】:

      这里最大的讽刺是,当你说“我想这样做”时,第一个表达应该成功了,

      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 &lt;- 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 击败了我eval(parse(...))scan 有一个 text 参数,顺便说一句。
      • 嗯。对,你是:scan(text=select.me, what="", sep=",") ...read.table 现在是如何处理它的文本参数的“文本”参数吗?一定是。为什么readLines 不接受“文本”参数?
      • 他们添加了一个正式的“文本”并检查“文件”是否丢失。似乎也可以使用readLines 完成。
      猜你喜欢
      • 2021-12-16
      • 1970-01-01
      • 2018-11-18
      • 2020-11-21
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      相关资源
      最近更新 更多