2012-03-15 6 views
35

私は因子のレベルに基づいて別々のdata.frameオブジェクトを作成しようとしています。私が持っているのであれば:新しいdata.framesへの因子のレベルに基づいてdata.frameを分割します

df <- data.frame(
    x=rnorm(25), 
    y=rnorm(25), 
    g=rep(factor(LETTERS[1:5]), 5) 
) 

は、どのように私は、対応するxy値を含むgのレベルごとに別々のdata.frame秒にdfを分割することができますか?私はsplit(df, df$g)を使用してその方法のほとんどを得ることができますが、私は要因の各レベルが独自のdata.frameを持っていることを望みます。これを行う最善の方法は何ですか?

ありがとうございました。

+0

あなたは 'スプリット(DF、DFの$ gを)'と間違っているかを説明することはできますか?これは、 'g 'の値ごとに1つずつ、' data.frame'のリストを返します。 –

答えて

70

splitはあなたの望むものとまったく同じだと思います。

strで見られるように、Xは、データフレームのリストであることに注意してください:

X <- split(df, df$g) 
str(X) 

あなたはグループgの名を持つ個々のオブジェクトをしたい場合は、splitからそれらの名前のオブジェクトにXの要素を割り当てることができますこれは、リストからデータフレームをインデックス化するだけで、splitが作成できるときには余分な作業のようです。

#I used lapply just to drop the third column g which is no longer needed. 
Y <- lapply(seq_along(X), function(x) as.data.frame(X[[x]])[, 1:2]) 

#Assign the dataframes in the list Y to individual objects 
A <- Y[[1]] 
B <- Y[[2]] 
C <- Y[[3]] 
D <- Y[[4]] 
E <- Y[[5]] 

#Or use lapply with assign to assign each piece to an object all at once 
lapply(seq_along(Y), function(x) { 
    assign(c("A", "B", "C", "D", "E")[x], Y[[x]], envir=.GlobalEnv) 
    } 
) 

編集またはグローバル環境での使用list2envに割り当てるlapplyを使用するよりも優れ:

names(Y) <- c("A", "B", "C", "D", "E") 
list2env(Y, envir = .GlobalEnv) 
A 
+0

ありがとうございます。私が難しかった個別のオブジェクトに 'split'を使って作成した各' data.frame'を分割していました。これはまさに私が探していたものです。 – smillig

関連する問題