0

我现在的方式是

coalesce <- function(x){
  if (is.null(x)) NA else x
}

data[,aa:=sapply(JSON, function(x) coalesce(x$a))]
data[,bb:=sapply(JSON, function(x) x$b)]

> JSON <- list(list(a=1, b=1), list(b=2))
> JSON
[[1]]
[[1]]$a
[1] 1

[[1]]$b
[1] 1


[[2]]
[[2]]$b
[1] 2


> sapply(JSON, function(x) coalesce(x$a))
[1]  1 NA
> sapply(JSON, function(x) x$b)
[1] 1 2

JSON是一个列表列表,每个列表都可能包含a我想要抓取的内容。如果a不存在,NA则返回。每个列表必须包含b. 两者ab总是标量。

MyRprof告诉我花费的大部分时间在于sapplyandFuncoalesce

我想知道有什么办法可以改善吗?

更新

样本数据

x <- list(a=1, b=1)
y <- list(a=1)
JSON <- rep(list(x,y),300000)

system.time(sapply(JSON, function(x) x$a))
system.time(sapply(JSON, function(x) coalesce(x$b)))
4

2 回答 2

1

您使用的方式存在错误sapply-您想要的是:

sapply(JSON, function(x) coalesce(x)$a)

但这确实不是最优的,并且在返回NULLcoalesce返回NA(可能不是你想要的。

修改coalesce

coalesce <- function(x){
  if (is.null(x$a)) NA else x$a
}

并做:

data[,b:=sapply(JSON, coalesce)]
于 2013-09-10T21:59:21.683 回答
1

在提取值并坚持之后尝试合并lapply,这应该会加快速度(如果您发布了合理的基准样本,我们可以对其进行测试):

unlist(lapply(lapply(JSON, "[[", "a"), coalesce))
于 2013-09-10T22:46:00.033 回答