2017-07-25 4 views
0

かなり大きな(〜1,000,000行)データフレームを操作するforループを書きましたが、動作が遅すぎるためオンラインで何も見つかりませんでした。forループなしでデータフレームを操作する

df=data.frame(v1=runif(10), v2=runif(10), v3=runif(10), v4=0, v5=0, v6=0, v7=0) 
for(i in 1:dim(df)[1]) { 
    df[i,4]=length(which(df[i,1:3]>0.00 & df[i,1:3]<0.10)) 
    df[i,5]=length(which(df[i,1:3]>0.10 & df[i,1:3]<0.50)) 
    df[i,6]=length(which(df[i,1:3]>0.50 & df[i,1:3]<0.90)) 
    df[i,7]=length(which(df[i,1:3]>0.90 & df[i,1:3]<1.00)) 
} 

私はこれを行うための関数を記述しようとしたが、それは一緒にすべての行を追加します。あなたが主なアイデアである必要条件と

test.fun <- function (df) { 
    df[,4]=length(which(df[,1:3]>0.00 & df[,1:3]<0.10)) 
    df[,5]=length(which(df[,1:3]>0.10 & df[,1:3]<0.50)) 
    df[,6]=length(which(df[,1:3]>0.50 & df[,1:3]<0.90)) 
    df[,7]=length(which(df[,1:3]>0.90 & df[,1:3]<1.00)) 
    return(df) 
} 
(test <- test.fun(df)) 
+0

これは私には意味を作っていません。これらの長さは単一の数値になりますが、列全体に割り当てられています。 –

+0

Erik、私はあなたのプロフィールであなたに(善い)質問をしたが、どれも回答を受け入れていないことが分かりました。 。 [誰かが私の質問に答えるとどうすればいいですか?](https://stackoverflow.com/help/someone-answers)と[なぜ私はそれをするべきですか?](https://meta.stackexchange.com/questions)をお読みください。/5234/how-does-accept-an-answer-work) – Masoud

答えて

4

rowSums

あなたはそれをきれいにするためにdplyrパッケージを使用することができます。

df %>% 
mutate(v4 = rowSums(df[,1:3]>0.00 & df[,1:3]<0.10))%>% 
mutate(v5 = rowSums(df[,1:3]>0.10 & df[,1:3]<0.50))%>% 
mutate(v6 = rowSums(df[,1:3]>0.50 & df[,1:3]<0.90))%>% 
mutate(v7 = rowSums(df[,1:3]>0.90 & df[,1:3]<1.00)) 


#   v1   v2  v3 v4 v5 v6 v7 
# 1 0.2875775 0.95683335 0.8895393 0 1 1 1 
# 2 0.7883051 0.45333416 0.6928034 0 1 2 0 
# 3 0.4089769 0.67757064 0.6405068 0 1 2 0 
# 4 0.8830174 0.57263340 0.9942698 0 0 2 1 
# 5 0.9404673 0.10292468 0.6557058 0 1 1 1 
# 6 0.0455565 0.89982497 0.7085305 1 0 2 0 
# 7 0.5281055 0.24608773 0.5440660 0 1 2 0 
# 8 0.8924190 0.04205953 0.5941420 1 0 2 0 
# 9 0.5514350 0.32792072 0.2891597 0 2 1 0 
# 10 0.4566147 0.95450365 0.1471136 0 2 0 1 

データ:

set.seed(123) #to make a reproducible example 
df=data.frame(v1=runif(10), v2=runif(10), v3=runif(10), v4=0, v5=0, v6=0, v7=0) 
+0

効率を上げるために、一番上に一度 'rowSums'を計算し、それを新しい変数に代入してから、合計を再計算するのではなく、それぞれの列が追加されました。 – Gregor

+0

@Gregorええ、そうです。それは 'rowSums'計算の中で3つの条件を削除します。しかしこれはforループよりも速いですし、あなたの提案が明らかに優れている効率を除けば、簡単で簡単なステップでOPの問題を解決すると思います。 – Masoud

関連する問題