web-dev-qa-db-ja.com

データフレーム内の列の効率的な乗算

2つの列を乗算して別の列を取得する、大きなデータフレームがあります。最初は、次のようにforループを実行していました。

for(i in 1:nrow(df)){
    df$new_column[i] <- df$column1[i] * df$column2[i]
}

しかし、これには9日ほどかかります。

別の選択肢はplyrで、実際には変数を誤って使用している可能性があります。

new_df <- ddply(df, .(column1,column2), transform, new_column = column1 * column2)

しかし、これは永遠にかかります

9
Doug

ブルーマジスターがコメントで言ったように、

df$new_column <- df$column1 * df$column2

正常に動作するはずです。もちろん、データの例がないかどうかを確実に知ることはできません。

21
Sacha Epskamp

data.table ソリューションは、コードを$で飛散させないという利点を持ちながら、多くの内部コピーを回避します。

 library(data.table)
 DT <- data.table(df)
 DT[ , new := column1 * column2]
11
mnel

Sacha's Answerのマイナーな、やや効率の悪いバージョンは、transform()またはwithin()を使用することです。

df <- transform(df, new = column1 * column2)

または

df <- within(df, new <- column1 * column2)

(ユーザーコードを$で飛ばすことは嫌いです。)

10
Gavin Simpson