【问题标题】:Extract values from data table从数据表中提取值
【发布时间】:2026-01-15 02:05:04
【问题描述】:

我有以下数据表(在示例中我只取 3 行):

data <- data.table(var=c("a","b","c"), value=c(-1,2,1))    

我想将每个变量提取为值,而无需在每次需要其中一个时进行子集化。 我想得到以下输出:

a <- -1
b <- 2
c <- 1

【问题讨论】:

  • 你真的不应该那样做。很高兴您将这些值很好地结合在一个数据结构中。

标签: r datatable


【解决方案1】:

一个选项是 split 返回一个 key/value 对。最好不要在全局环境中创建对象

lst1 <- split(data$value, data$var)
lst1
#$a
#[1] -1

#$b
#[1] 2

#$c
#[1] 1

但是,如果我们需要它,

list2env(lst1, .GlobalEnv)
a
#[1] -1
b
#[1] 2
c
#[1] 1

或者另一个选项是deframe,然后使用list2env

library(tibble)
list2env(as.list(deframe(data)), .GlobalEnv)

【讨论】:

    【解决方案2】:

    虽然不建议在全局环境中创建对象,但我们可以尝试eval(parse(...)) 方法来解决您的问题,

    eval(parse(text = do.call(paste, c(data, sep = '<-'))))
    a
    #[1] -1
    b
    #[1] 2
    c
    #[1] 1
    

    【讨论】:

      【解决方案3】:

      purrr:

       res<-purrr::map2(data$var, data$value, 
                  function(x,y) 
                   x <- y
      
                  )
      names(res) <- data$var
      

      上面设置了得到结果后的名字。

      res
      
      $a
      [1] -1
      
      $b
      [1] 2
      
      $c
      [1] 1
      

      使用basemapply,我们可以使用:

        as.list(mapply(function(x,y) assign(x,y,new.env()),
             data$var,data$value))
      $a
      [1] -1
      
      $b
      [1] 2
      
      $c
      [1] 1
      

      或者:

       mapply(function(x,y) append(list(),y),
             data$var,data$value)
      $a
      [1] -1
      
      $b
      [1] 2
      
      $c
      [1] 1
      

      【讨论】: