【问题标题】:Apply a function to a subset of data.table columns, by column-indices instead of name通过列索引而不是名称将函数应用于 data.table 列的子集
【发布时间】:2013-05-22 22:12:38
【问题描述】:

我正在尝试将函数应用于大型 data.table 中的一组列,而不是单独引用每一列。

a <- data.table(
  a=as.character(rnorm(5)),
  b=as.character(rnorm(5)),
  c=as.character(rnorm(5)),
  d=as.character(rnorm(5))
)
b <- c('a','b','c','d')

使用上面的 MWE,这个:

a[,b=as.numeric(b),with=F]

有效,但是这个:

a[,b[2:3]:=data.table(as.numeric(b[2:3])),with=F]

不起作用。将as.numeric 函数仅应用于a 的第2 列和第3 列而不单独引用它们的正确方法是什么。

(实际数据集中有几十列,不切实际)

【问题讨论】:

  • 另外,如果您只想通过索引引用多个列,,with=F] 允许 j 成为列索引,例如dt[, 2:3, with =F。但是根据@mnel 的回答,对每个函数应用一个函数更复杂。

标签: r data.table multiple-columns indices


【解决方案1】:

惯用的方法是使用.SD.SDcols

您可以通过包装() 来强制在父框架​​中评估 RHS

a[, (b) := lapply(.SD, as.numeric), .SDcols = b]

对于第 2:3 列

a[, 2:3 := lapply(.SD, as.numeric), .SDcols = 2:3]

mysubset <- 2:3
a[, (mysubset) := lapply(.SD, as.numeric), .SDcols = mysubset]

【讨论】:

  • 如果你想在这里使用“by”分组,是否必须提前包含在mysubset中?
  • @TrevorAlexander - 不,By 列不在 .SD 中,它们作为单个值存在于创建 .SD 的环境中。
  • 嗨,如果我想在除“b”之外的所有列上应用该函数,我该如何使用它?谢谢!
  • @Christa 你仍然可以使用a[, (b[b != 'b']) := lapply(.SD, as.numeric), .SDcols = b[b != 'b']]。但是mySubset &lt;- setdiff(b, 'b') 后跟a[, (mySubset) := lapply(.SD, as.numeric), .SDcols = mySubset] 更具可读性并且看起来很直接
猜你喜欢
  • 2020-08-11
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
相关资源
最近更新 更多