2017-07-26 33 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 

有超過90萬的條目7分的變量被分成約1660非空基 - 我已經通過創建一個新的分組數據幀

發現這
> 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: 

現在我想利用非空dataframes ,將它們重命名爲例如'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。將它存儲在列表中可能是更好的方法,因爲它更容易與數據框架系統地交互。看到這裏的[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,並用Z因爲R不喜歡的變量名以數字開頭前置newnames

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]]) } 
相關問題