2013-07-13 10 views
9

同じ操作が必要なデータフレームが多数あるとします。たとえば、Rはデータフレームをどのようにループできますか?

prefix <- c("Mrs.","Mrs.","Mr","Dr.","Mrs.","Mr.","Mrs.","Ms","Ms","Mr") 
measure <- rnorm(10) 
df1 <- data.frame(prefix,measure) 
df1$gender[df1$prefix=="Mrs."] <- "F" 

隣接行の値が "Mrs."の場合は、genderというインジケータ変数を作成します。 Rの文字列変数をループする一般的な方法は、関数as.name()hereから適応された「I」から引用符を削除するために追加しました:

dflist <- c("df1","df2","df3","df4","df5") 

for (i in dflist) { 
    as.name(i)$gender[as.name(i)$prefix=="Ms."] <- "F" 
    } 

残念ながら、これは動作しません。助言がありますか?

答えて

8

すべてのデータフレームをリストに入れて、/ lapplyをループします。長い目で見れば、ずっと簡単になるでしょう。非「F」の値は、<NA>であろうと、それらはR関数内でうまく機能しないであろうから

dfList <- list(df1=df1, df2=df2, ....) 

dfList <- lapply(dfList, function(df) { 
    df$gender[df$prefix == "Mrs."] <- "F" 
    df 
}) 

dfList$df1 
+0

ありがとう、どうして私は新しいリストからのデータフレームdfList? –

+0

と 'dfList [[1]]'などを使用しています。 –

2

単一インスタンスの例は、実際に、通常の意味でのインジケーターを作成しないであろう。算術演算と論理演算の両方が戻ります。これを代わりに試してください:

df1$gender <- ifelse(prefix %in% c("Mrs.", "Ms") , "probably F", 
       ifelse(prefix=="Dr.", "possibly F", # as is my wife. 
             "probably not F")) 

次に、@ HongDoiのアドバイスに従ってリストを使用してください。そして、a)完全なデータフレームオブジェクトを返すこと、b)結果をオブジェクト名に割り当てること(これらはどちらもR-newbsによって忘れられていることが多い)。

関連する問題