2017-07-26 6 views
1

Rのいくつかの条件に基づいて大きなデータフレームを小さなデータフレームに分割しようとしています。 これらの各データフレームを分割された変数に基づいて名前が付けられますが、1660を超える新しい「サブ」データフレームがあるため、手動で行うことはできません。スプリットを使用してRで新しいデータフレームを作成し、変数条件に基づいて名前を変更

全体のデータフレームの例:

ID LENGTH GRADE CODE  DURATION STATUS 

1 1   A1  ABC  Less than 10  Y    
2 2   A1  ABC  More than 10  Y    
3 1   A1  DEF  Less than 10  Y      
4 2   A2  ABC  Less than 10  Y      
5 1   B1  ABC  More than 10  Y      
6 3   B2  DEF  Less than 10  Y 

およそ1660空でないグループに7つの変数によって分割される90万のエントリがあります - 私は、新しいグループ化されたデータフレーム

を作成することによって、これを発見しました
> Grouped_DF<- DF %>% group_by(LENGTH,GRADE,CODE,DURATION,STATUS,...) 

> nrow(Grouped_Data) 
[1] 1660 

私が望むグループで構成されていますが、これらのグループごとに新しいデータフレームを作成し、各グループに属するすべてのエントリを作成します。私は、スプリット機能を使って試してみました:

次のリストを生成し
SplitGroups<-split(DF, with(DF, interaction(LENGTH,GRADE,CODE,DURATION,STATUS,..))) 

> class(SplitGroups) 
[1] "list" 
> length(SplitGroups) 
[1] 24480 

出力の例を:

> SplitGroups 
$1.A1.ABC.Less Than 10.N` 
# A tibble: 10 x 65 
# Groups: ID [10] 
# ... with 65 variables: 

は今、私は非空のデータフレームを取りたいです例えば、 '1.A1.ABC.Less Than 10.N'(または同様のもの)のように名前を変更し、これをグローバル環境に格納します。

私は、これは、たとえば、サブセットを使用して行うことができる承知しています:

1.A1.ABC.LessThan10.N <- subset(DF, LENGTH==1 & GRADE=="A1" & CODE=="ABC" & .....) 

というように、これは必要なサブセットの数のための実用的ではありません。

ありがとうございます、ありがとうございます。

+1

'splitGroups < - splitGroups [sapply(splitGroups、nrow)> 0]'はすべての空のdata.framesを削除します。これをリストに格納する方が、data.framesと体系的にやり取りする方が簡単なので、おそらく好ましい方法です。これを行うためのヒントについては、[gregorの投稿](https://stackoverflow.com/questions/17499013/how-do-i-make-a-list-of-data-frames)を参照してください。 – lmo

+0

'Filter(function(x)nrow(x)> 0、splitGroups)'を使うことができます。 – akrun

答えて

0

私もリストにあなたのデータフレームを保つことをお勧めしますが、ここではあなたが

あなたのデータたかったのソリューションです:

df <- data.frame(ID=1:6, LENGTH=c(1,2,1,2,1,3), 
      GRADE=c(rep("A1",3),"A2","B1","B2"), 
      CODE=c("ABC","ABC","DEF","ABC","ABC","DEF"), 
      DURATION=c("Less than 10", "More than 10", "Less than 10", 
         "Less than 10", "More than 10", "Less than 10"), 
      STATUS=rep("Y",6), stringsAsFactors=F) 

は、すべての列でデータをグループ化して、列を追加するには(newnames )を使用して一意の変数名を作成します。私はgsubを使用してDURATIONからスペースを削除してRが数字で始まる変数名を好きではないので、Znewnamesを先頭に追加*注:

grp.df <- df %>% 
     group_by_all() %>% 
     mutate(newnames=paste0("Z",ID,LENGTH,GRADE,CODE,gsub(" ", "", DURATION),STATUS)) 

あなたはすでにやったとして(リストにあなたのデータフレームを分割...)

split.df <- split(grp.df, grp.df$newnames) 

使用して、新しい変数名で分割データフレームを保存assign

for (I in 1:length(split.df)) { assign(unique(split.df[[I]]$newnames), split.df[[I]]) } 
関連する問題