通过列索引而不是名称将函数应用于 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 <- setdiff(b, 'b')
后跟a[, (mySubset) := lapply(.SD, as.numeric), .SDcols = mySubset]
更具可读性并且看起来很直接以上是关于通过列索引而不是名称将函数应用于 data.table 列的子集的主要内容,如果未能解决你的问题,请参考以下文章
通过标题名称而不是列索引引用 VSTO Excel ListObject 的列
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函数把行索引重置为列数据(原来的行索名称转化为列索引的最外层)