使用拆分在R中创建新的数据框,并根据变量条件进行重命名

使用拆分在R中创建新的数据框,并根据变量条件进行重命名

问题描述:

我试图根据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 0]'将删除所有空的data.frames。将它存储在列表中可能是更好的方法,因为它更容易与数据框架系统地交互。看到这里的[gregor的帖子](https://*.com/questions/17499013/how-do-i-make-a-list-of-data-frames)上的一些技巧。 – lmo

+0

我们可以使用'Filter(function(x)nrow(x)> 0,splitGroups)' – akrun

我还建议让您的数据帧在列表中,但这里是你想要的

你的数据有什么解决办法:

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]]) }