2016-10-17 8 views
0

Rでは、私は10500×6000というかなり大きなデータフレーム(d)を持っています。すべての値は数値です。 これは、行と列の両方に多くのna値要素を持っています。これらの値をゼロに置き換えることを検討しています。私が使用している:は、Rの計算速度で定数に欠損値を設定します

d[is.na(d)] <- 0

が、これはかなり遅いです。 Rでこれを行うより良い方法はありますか?

私は他のRパッケージを使用しています。

「なぜnaをゼロで置き換えるのですか」ではなく、計算速度に重点を置いて議論することをお勧めします。そして、同様のQが(How do I replace NA values with zeros in an R dataframe?)質問されていることを認識している間に、多くの欠損値がある大きなデータフレームでは計算速度に焦点が当てられていません。

ありがとうございます!

編集ソリューション: として親切示唆し、私はすべての列がNASに数値または割り当て0でなければならないことを推測

+4

データフレームの比較は、このデータフレームを、同じタイプ(すなわち、すべての数値、またはすべての文字)の列がありますか?それを行列として格納することは、これを高速化する可能性があります。 – Spacedman

+1

多くの場合、 'data.table'への変換は速度向上をもたらしますが、' is.na.data.table'はそれらのうちの一つではありません。 – shayaa

+0

@ Spacedman、すべて数字です - ごめんなさい。編集します。 – Peter

答えて

1

is.naは桁計算をスピードアップ適用する前にマトリックスにDを変化させます賢明ではないでしょう。

私は、次のタイミングを取得し、約1万のNAで:だから

> M <- matrix(0, 10500, 6000) 
> set.seed(54321) 
> r <- sample(1:10500, 10000, replace=TRUE) 
> c <- sample(1:6000, 10000, replace=TRUE) 
> M[cbind(r, c)] <- NA 
> D <- data.frame(M) 
> sum(is.na(M)) # check 
[1] 9999 
> sum(is.na(D)) # check 
[1] 9999 
> system.time(M[is.na(M)] <- 0) 
    user system elapsed 
    0.19 0.12 0.31 
> system.time(D[is.na(D)] <- 0) 
    user system elapsed 
    3.87 0.06 3.95 

、NASはこの数で、私は行列を使用して、大きさの高速化の順序について取得します。しかし、データフレームを使用する時間は私の控えめなノートパソコンではわずか4秒で、質問に答えるよりもはるかに時間がかかりません。問題が本当にこの大きさであれば、なぜそれは遅いのですか?

こちらがお役に立てば幸いです。

+0

私はこれらのサイズのデータ​​フレームを数百回ループしています。そのうちいくつかはさらに大きくなっているので、速度の向上は実用的です。答えをありがとう。 – Peter

1

data.tableパッケージを使用すると、パフォーマンスが大幅に向上します。 一般的には、操作や変換が非常に高速です。 欠点は、構文の学習曲線です。 しかし、あなたがスピードパフォーマンスの向上を望んでいるならば、その投資は価値があるかもしれません。

を生成偽データ

r <- 10500 
c <- 6000 
x <- sample(c(NA, 1:5), r * c, replace = TRUE) 
df <- data.frame(matrix(x, nrow = r, ncol = c)) 

基本R

df1 <- df 
system.time(df1[is.na(df1)] <- 0) 

    user system elapsed 
    4.74 0.00 4.78 

tidyr - replace_na()

dfReplaceNA <- function (df) { 
    require(tidyr) 
    l <- setNames(lapply(vector("list", ncol(df)), function(x) x <- 0), names(df)) 
    replace_na(df, l) 
} 
system.time(df2 <- dfReplaceNA(df)) 

    user system elapsed 
    4.27 0.00 4.28 

データ。テーブル - set()

dtReplaceNA <- function (df) { 
    require(data.table) 
    dt <- data.table(df) 
    for (j in 1:ncol(dt)) {set(dt, which(is.na(dt[[j]])), j, 0)} 
    setDF(dt) # Return back a data.frame object 
} 
system.time(df3 <- dtReplaceNA(df)) 

    user system elapsed 
    0.80 0.31 1.11 

all.equal(df1, df2) 

[1] TRUE 

all.equal(df1, df3) 

[1] TRUE 
関連する問題