2017-05-30 11 views
0

forループを使用して途中でデータフレームと変数名を保存しようとしています。forループ内にデータフレームと変数の名前を保存する

私はregionmapというデータフレームを持っていますが、変数(Var3)の1つは何千もの異なる値を取ることができますが、この形式の15があります。 "RegionMap *"ここで*はベクトルcの値の1つです:

regions <- c("A", "B"........"Z") 

私は、これらの各値はダミーで、相対周波数を変換し、新しいデータフレームとしてそれらの行を保存し、表示され、次いで、新たなデータフレームをマージする行を選択し、ループを実行する必要がありますこれらのすべてを集めることを目指したより大きなものです。

次のコードは動作しますが、私はすべての "A"(選択する文字列とデータフレームと変数の両方の名前として)をcの他の要素と置き換えて15回実行できるかどうかを知りたかっただけですforループ。

A <- regionmap[grep("RegionMap A", regionmap$Var3), ] 

A$Freq[A$Freq > 1] <- 1 

A$Var3 <- NULL 

colnames(A) <- c("name", "date", "RegionMap A") 

access_panel <- merge(access_panel, A,by=c("name", "date")) 
+0

データのサンプルを追加することができれば、人々は簡単に答えることができます。 https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – austensen

答えて

0

あなたはとにかく一緒にすべてをマージしている場合、異なる変数の名前を指定する必要はありません - ちょうど列名。このようなものは、このトリックを行う必要があります...

regions <- c("A", "B"........"Z") 
for(x in regions){ 
    mapname <- paste("RegionMap",x,sep=" ") #this is all that needs to change each time 
    A <- regionmap[grep(mapname, regionmap$Var3), ] 
    A$Freq[A$Freq > 1] <- 1 
    A$Var3 <- NULL 
    colnames(A) <- c("name", "date", mapname) 
    if(x=="A") { 
     access_panel <- A #first one has nothing to merge into 
    } else { 
     access_panel <- merge(access_panel, A ,by=c("name", "date")) 
    } 
} 
+1

ありがとうございます。私は貧弱に説明しましたが、access_panelはループで作成された他のものを追加する既存のデータフレームです。 「if ... else」の部分を削除しても、それは完全に機能します。 – Antonio

-1

使用アサインを(ループための標準は動作しません)。 限り、あなたのサフィックスが「tempvar」ではないとして、これは動作するはずです:

for (suffix in regions){ 
    tempvar <- regionmap[grep(paste("RegionMap",suffix), regionmap$Var3), ] 
    tempvar$Freq[tempvar$Freq > 1] <- 1 
    tempvar$Var3 <- NULL 
    colnames(tempvar) <- c("name", "date", paste("RegionMap",suffix)) 
    access_panel <- merge(access_panel, tempvar,by=c("name", "date")) 
    assign(suffix,tempvar) 
} 
+1

いいえ、 'assign'は使用しないでください。リストを使用してください。 – Roland

+0

それは良い習慣ですが、質問に答えないでしょうか? –

関連する問題