1

CSVファイルに次のような列がありますc("","1","1 1e-3")(つまり、空白が区切られています)。私はすべての値を実行しようとしています。sum()少なくとも1つの値がある場合は値を取得し、それ以外の場合は戻りNAます。

私のコードは現在次のようなことをしています:

x <- c("","1","1 2 3")
x2 <- as.numeric(rep(NA,length(x)))
for (i in 1:length(x)) {
  si <- scan(text=x[[i]],quiet=TRUE)
  if (length(si) > 0)
    x2[[i]] <- sum(si)
}

私はこれを速くするのに苦労しています。xは実際には数十万行を含むCSVファイルの列のセットであり、Rでこれを実行できるはずだと考えました。

(これらは、リバーシブルジャンプMCMCアルゴリズムの後方からの間引きされたサンプルであるため、ファイル全体で次元が変化するときに複数の値を組み合わせます。有用な列が必要です)。

4

2 に答える 2

3

@Chase のアイデアに基づいて構築されていますが、NA を処理し、ヘルパー関数の名前も避けています。

unlist(lapply(strsplit(x, " "),
              function(v)
                if (length(v) > 0)
                  sum(as.numeric(v))
                else
                  NA
      )      )
于 2012-07-16T14:14:03.840 に答える
2

これは少し速く実行されるようで、うまくいくかもしれません。

#define a helper function
f <- function(x) sum(as.numeric(x))
unlist(lapply((strsplit(x3, " ")), f))
#-----
[1] 0 1 6

これは NA の代わりに 0 を返しますが、それはあなたにとって契約を破るものではないでしょうか?

これがより大きな問題にどのようにスケールするか見てみましょう:

#set up variables
x3 <- rep(x, 1e5)
x4 <- as.numeric(rep(NA,length(x3)))
#initial approach
system.time(for (i in 1:length(x3)) {
  si <- scan(text=x3[[i]],quiet=TRUE)
  if (length(si) > 0)
    x4[[i]] <- sum(si)
})
#-----
   user  system elapsed 
   30.5     0.0    30.5 

#New approach:
system.time(unlist(lapply((strsplit(x3, " ")), f)))
#-----
   user  system elapsed 
   0.82    0.01    0.84
于 2012-07-16T13:58:29.857 に答える