通过列索引而不是名称将函数应用于 data.table 列的子集

Posted

技术标签:

【中文标题】通过列索引而不是名称将函数应用于 data.table 列的子集【英文标题】:Apply a function to a subset of data.table columns, by column-indices instead of name 【发布时间】: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 的回答,对每个函数应用一个函数更复杂。 【参考方案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] 更具可读性并且看起来很直接

以上是关于通过列索引而不是名称将函数应用于 data.table 列的子集的主要内容,如果未能解决你的问题,请参考以下文章

通过标题名称而不是列索引引用 VSTO Excel ListObject 的列

如何将函数应用于每一行data.table

pandas使用read_csv函数读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用方括号[]基于最外层列索引名称索引列数据

pandas使用read_csv函数读取csv数据columns.get_level_values属性查看数据集的列索引中指定层级的索引内容(使用索引位置或者名称)

pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用reset_index函数把行索引重置为列数据(原来的行索名称转化为列索引的最外层)

pandas读取csv数据index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引使用reset_index函数把行索引重置为列数据(原来的行索名称转化为列索引的最外层)