2017-12-08 13 views
0

forループでforループで指定された正しい順序に基づいて、行内にデータを格納するようにしたいのですが、何らかの形でデータが新しいデータフレームにランダムにバインドされます。forループ内での順序付けとバインド

背景情報:

  • 私はこれの間で、FMCG業界からのデータとデータフレームを持っているが製品の価格です。
  • 私のデータフレームは、私はまた、競争に適応する55個の異なる製品カテゴリ私の計量経済学(マーケティング)モデルでは
  • のトップ3ブランドで構成されていので、私はブランドA、BおよびCの競争の平均価格を計算している何をすべきか条件に基づいて
  • カテゴリ5(私の合計データセットから)というカテゴリのループを実行すると、正しい平均値が得られ、これらをスタックするので、それらをメインデータフレームにバインドできます。このメインデータフレームには、すべてのブランドが上から下に、各カテゴリごとに、毎週リストされています。
  • 問題:forループを実行すると、平均が計算されますが、バインドする最後の積み重ねられたデータフレームは、すべての値をシャッフルして、それらはもはや順不同になります。
  • したがって、私は計算された平均を順番に保持するコマンドを見つける必要があります(競合カテゴリ5のブランドAの週1を最初の行として、カテゴリ550のブランドCの週208の平均を最後にしています)。 1つのカテゴリでは行いますが、forループでは行いません。

コード:

##for loop for all competitor average prices accross all categories 
    for(X in c("5", "24", "32", "43", "49", "56", "63", "81", "94", "96", "102", "105", "115", "122", "129", "133", "145", "154", "180", "189", "201", "210", "219", "226", "231", "245", "264", "277", "280", "301", "313", "335", "346", "361", "397", "409", "410", "411", "413", "437", "443", "480", "488", "493", "500", "516", "526", "533", "535", "536", "542", "543", "549", "550")){ 
    PriceX <- read.table(paste0("/Users/censored",X,".csv"), header=TRUE, sep=",") 
    PriceX <- transpose(PriceX) 
    PriceX <- PriceX[-c(1), ] #deleting the first column of df, contains brand names 
    PriceX <- transpose(PriceX) 
    PriceX <- sapply(PriceX, as.numeric) 
    PriceX <- data.frame(PriceX) 
    CompPriceXa <- PriceX[-c(1:2), ] #delete first and second row, contains totals and Brand A 
    CompPriceXa <- CompPriceXa %>% mutate_if(is.numeric, funs(ifelse(. == 0, NA, .))) #Make all zeros NA, otherwise the means are calculated over rows. 
    CompPriceXa <- colMeans(CompPriceXa, na.rm=T) #calculate the mean of competitor prices when Brand A is focal brand 
    CompPriceXa <- as.matrix(CompPriceXa) 
    CompPriceXb <- PriceX[-c(1, 3), ] 
    CompPriceXb <- CompPriceXb %>% mutate_if(is.numeric, funs(ifelse(. == 0, NA, .))) 
    CompPriceXb <- colMeans(CompPriceXb, na.rm=T) 
    CompPriceXb <- as.matrix(CompPriceXb) 
    CompPriceXc <- PriceX[-c(1, 4), ] 
    CompPriceXc <- CompPriceXc %>% mutate_if(is.numeric, funs(ifelse(. == 0, NA, .))) 
    CompPriceXc <- colMeans(CompPriceXc, na.rm=T) 
    CompPriceXc <- as.matrix(CompPriceXc) 
    StackedCompPrice <- rbind(CompPriceXa, CompPriceXb, CompPriceXc) #stack the average competitor prices of Brand A, B and C. 
    StackedCompPrice <- as.data.frame(StackedCompPrice) 
    ALLStackedCompPrice <- rbind(StackedCompPrice, ALLStackedCompPrice)} 

ALLStackedCompPrice <- StackedCompPrice[NULL,] #first run the for loop, then run this command outside loop to create empty df, then run the forloop again and it will be filled with all the values from all categories 

は、あなたたちは私を助けることを願って!

+0

データの読み込み後にサンプルを提供できますか?ここにはいくつかの不必要な手順があるようです。また、これはforループでは必要ありません。これを関数に変換してから、ベクトルや数値のリストに適用し、リストを変換して順序付けられたデータフレームに戻したいとします。しかし、私はデータを見ずにはわからない。 'dput(head(PriceX、30))'を使ってみてください。 –

+0

うん、私はforループでもこれを行うべきかどうか疑問に思っていた。私はこれのような他の2つの変数でそれを行い、完全に機能しました。私はRで経験豊かではないので、他の方法でも問題を解決することができます。私はちょうど毎週競合他社の平均(合計208)を計算し、これらの値をメインのデータフレームに結びつける必要があります。私はこれまでの私のdfのイラストを以下の答えに載せます。 – PimM

+0

あなたはここで余計な仕事をしています。いくつかのサンプルデータは助けになります(秘密保持のためのスクラブがうまくいきます)。それは行1が合計であるように見えますか?他の列は私が完全に理解していない。 1:4以上の行はありますか?私はあなたが2か3か4のどちらかを取り除いているのに気付いて残りの数学をしていますが、理由は分かりません。 –

答えて

0

全体の問題が解決されます!それは非常に単純なものでした... forループを逆にして、カテゴリー '550'を最初に、 '5'を最後にしてください。 forループは少し大きいかもしれませんし、より速く行うことができますが、それがうまくいく限り、うまくいきます。あなたの迅速な対応と助けてくれてありがとう!

0

forループをネストして、そのループのアサイナを変更したいデータフレームインデックスの中に配置すると、問題を解決するはずです。あなたは、リンクで見ることができるように明らかにデータがない、この答えではなく、具体的なコードよりもちょうど指針である...

##for loop for all competitor average prices accross all categories 
     for(X in c("5", "24", "32", "43", "49", "56", "63", "81", "94", "96", "102", "105", "115", "122", "129", "133", "145", "154", "180", "189", "201", "210", "219", "226", "231", "245", "264", "277", "280", "301", "313", "335", "346", "361", "397", "409", "410", "411", "413", "437", "443", "480", "488", "493", "500", "516", "526", "533", "535", "536", "542", "543", "549", "550")){ 
     PriceX <- read.table(paste0("/Users/censored",X,".csv"), header=TRUE, sep=",") 
     PriceX <- transpose(PriceX) 
     PriceX <- PriceX[-c(1), ] #deleting the first column of df, contains brand names 
     PriceX <- transpose(PriceX) 
     PriceX <- sapply(PriceX, as.numeric) 
     PriceX <- data.frame(PriceX) 
     CompPriceXa <- PriceX[-c(1:2), ] #delete first and second row, contains totals and Brand A 
     CompPriceXa <- CompPriceXa %>% mutate_if(is.numeric, funs(ifelse(. == 0, NA, .))) #Make all zeros NA, otherwise the means are calculated over rows. 
     CompPriceXa <- colMeans(CompPriceXa, na.rm=T) #calculate the mean of competitor prices when Brand A is focal brand 
     CompPriceXa <- as.matrix(CompPriceXa) 
     CompPriceXb <- PriceX[-c(1, 3), ] 
     CompPriceXb <- CompPriceXb %>% mutate_if(is.numeric, funs(ifelse(. == 0, NA, .))) 
     CompPriceXb <- colMeans(CompPriceXb, na.rm=T) 
     CompPriceXb <- as.matrix(CompPriceXb) 
     CompPriceXc <- PriceX[-c(1, 4), ] 
     CompPriceXc <- CompPriceXc %>% mutate_if(is.numeric, funs(ifelse(. == 0, NA, .))) 
     CompPriceXc <- colMeans(CompPriceXc, na.rm=T) 
     CompPriceXc <- as.matrix(CompPriceXc) 
     StackedCompPrice <- rbind(CompPriceXa, CompPriceXb, CompPriceXc) #stack the average competitor prices of Brand A, B and C. 
     StackedCompPrice <- as.data.frame(StackedCompPrice) 
for(i in 1:5{ 
     ALLStackedCompPrice[,i]<- rbind(StackedCompPrice, ALLStackedCompPrice) 
}} 

    ALLStackedCompPrice <- StackedCompPrice[NULL,] #first run the for loop, then run this command outside loop to create empty df, then run the forloop again and it will be filled with all the values from all categories 
+0

これを実行しようとしましたが、どうにかしてブラケットが不一致なので、動作しません。 – PimM

0

これは私が上で計算を行うデータセットの印象を与えます:

X VAR1 Var2Var3 VAR4

1-1 6.584001 6.618493 6.669796 6.14605

2-1 6.316876 6.299771 6.264874 5.531244

3-1 3.914301 3.953827 3.955841 3.640814

4-1 3.629302 3.655962 3.657091 3。525953

5-1 4.801913 4.791146 4.819135 4.888309

関連する問題