【发布时间】:2014-04-04 18:15:29
【问题描述】:
我经常遇到如下结构的数据:
employees <- list(
list(id = 1,
dept = "IT",
age = 29,
sportsteam = "softball"),
list(id = 2,
dept = "IT",
age = 30,
sportsteam = NULL),
list(id = 3,
dept = "IT",
age = 29,
sportsteam = "hockey"),
list(id = 4,
dept = NULL,
age = 29,
sportsteam = "softball"))
在许多情况下,此类列表可能有数千万个项目,因此内存问题和效率始终是一个问题。
我想将列表转换为数据框,但如果我运行:
library(data.table)
employee.df <- rbindlist(employees)
由于 NULL 值,我得到错误。我的正常策略是使用如下函数:
nullToNA <- function(x) {
x[sapply(x, is.null)] <- NA
return(x)
}
然后:
employees <- lapply(employees, nullToNA)
employee.df <- rbindlist(employees)
返回
id dept age sportsteam
1: 1 IT 29 softball
2: 2 IT 30 NA
3: 3 IT 29 hockey
4: 4 NA 29 softball
但是,nullToNA 函数在应用于 1000 万个案例时非常慢,因此如果有更有效的方法会很好。
似乎减慢了进程的一点是 is.null 函数一次只能应用于一项(不像 is.na 可以一次性扫描完整列表)。
关于如何在大型数据集上有效执行此操作的任何建议?
【问题讨论】:
-
你试过 do.call 和 rbind 吗?像这样
employee.df<-do.call("rbind",employees) -
如果为null,原始数据是否实际上是“NULL”,还是只是空的?
-
原始数据有NULL值。它是通过抓取 JSON 文件并通过 rjson 转换生成的。
-
在一般情况下,如果原始(抓取的)数据集已经是一个 data.frame(例如,来自
XML::readHTMLTable()),并且 NULL 单元格只是长度为 0 的字符串,请使用以下:df <- data.frame(apply(df, c(1,2), FUN=function(x) ifelse(x=="",NA,x)))
标签: r performance list null