【问题标题】:In R data.table, add a column which name is based on a string在 R data.table 中,添加一个名称基于字符串的列
【发布时间】:2016-06-03 10:43:03
【问题描述】:

我想在 data.table 中添加一列。但是这个新列的名称必须从字符向量中提取。我写这个:

add_var=function(index){
  label=c("products","price")
  var_name=label[index]
  df=data.frame(x=c(1,2,5,9),y=c(5,2,6,7))
  dt=as.data.table(df)
  dt[,(as.name(var_name)):=5]
  return(dt)
}
new_ds=add_var(1)

我期待类似的东西

x y products
1 5        5
2 2        5
5 6        5
9 7        5

但是,相反,我收到了这条错误消息:

 Error in `[.data.table`(dt, , `:=`((as.name(var_name)), 5)) : 
  LHS of := must be a symbol, or an atomic vector (column names or positions). 

有人知道如何修复我的功能以使其正常工作吗?

【问题讨论】:

  • 不要在那里使用as.name:= 需要 LHS 上的字符向量。另外,您可以直接使用data.table 构造一个data.table。最后,调用函数后第一次使用return(dt[])ensure the data.table is printed
  • 另外,setDT(df)dt=as.data.table(df) 更节省内存并且速度更快

标签: r string function data.table


【解决方案1】:

你只需要这个:

label <- c("products","price")
df <- data.frame(x=c(1,2,5,9),y=c(5,2,6,7))


setDT(df)[ , (label) := 5]


#>    x y label products price
#> 1: 1 5     5        5     5
#> 2: 2 2     5        5     5
#> 3: 5 6     5        5     5
#> 4: 9 7     5        5     5

【讨论】:

  • 太棒了!你能告诉我更多关于 setDT 的信息吗?实际上它适用于这个命令 setDT(dt)[ , (var_name) := 5]
  • setDT(df)data.frame 转换为 data.table 而不将其复制到内存中。您也可以分两个单独的步骤执行此操作,首先是 setDT(df),然后是 df[ , (label) := 5]。如果你想把它转换回data.framte,很简单,就像setDF(df)
  • 哇!伟大的!谢谢!
猜你喜欢
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多