R语言:快速移除data.table列表中每个data.table指定列的方法
批量移除列表中表格指定列的高效方案
用lapply结合dplyr实现
如果习惯dplyr的语法,lapply可以简洁完成批量操作,比手动for循环更紧凑:
library(dplyr) # 直接传递select函数和参数 df.list <- lapply(df.list, select, -id)
或者用匿名函数写法,逻辑更直观:
df.list <- lapply(df.list, function(tbl) select(tbl, -id))
用purrr::map实现
purrr的map函数更贴合函数式编程风格,适合管道流操作:
library(purrr) # 公式风格写法 df.list <- map(df.list, ~select(.x, -id)) # 结合管道操作 df.list <- df.list %>% map(~select(.x, -id))
针对data.table的极致高效方案(推荐)
如果你的列表元素是data.table(而非示例中的data.frame),可以利用data.table的引用修改特性,彻底避免数据复制,速度和内存效率拉满:
先将列表转成data.table(如果还没转):
library(data.table) dt.list <- lapply(df.list, as.data.table)
然后用:=操作符直接移除列,无需重新赋值(invisible用来屏蔽不必要的输出):
invisible(lapply(dt.list, function(dt) dt[, id := NULL]))
更简洁的等价写法:
invisible(lapply(dt.list, `[`, , !"id"))
关于原循环速度慢的原因
手动for循环慢通常是因为每次赋值df.list[[i]]会产生完整的数据副本,处理大表格时开销极大。上述方案中,lapply/map内部做了优化,而data.table的引用修改直接在原对象上操作,彻底消除了复制开销,是大数据量下的最优选择。
内容的提问来源于stack exchange,提问作者Sky Scraper
相关产品推荐
相关产品推荐

