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返されます。各リストには が含まれている必要がありますbaとはb常にスカラーです。

Rprofは、費やされた時間の大部分がsapplyFunとにあることを教えてくれますcoalesce

改善する方法はないか悩んでいます。

アップデート

サンプルデータ

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

値を抽出して に固執した後、合体を試してみてくださいlapply。これにより、速度が向上するはずです (妥当なベンチング サンプルを投稿した場合は、それをテストできます)。

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

あなたが使用している方法にエラーがありますsapply- あなたが望むのは:

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

しかし、それは実際には最適ではなく、返さNULLれたときにcoalesce返されます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 に答える