使用Split在R中创建新数据帧,并根据可变条件重命名

时间:2017-07-26 11:59:53

标签: r dataframe split subset rename

我试图根据R中的许多条件将大数据帧拆分成更小的数据帧。 我希望每个数据框都根据它们被拆分的变量来命名,但是因为有超过1660个新的" sub"数据框,我不能手动完成。

整个数据框的一个例子:

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 

有超过900,000个条目被7个变量拆分成大约1660个非空组 - 我通过创建一个新的分组数据框找到了这个

> Grouped_DF<- DF %>% group_by(LENGTH,GRADE,CODE,DURATION,STATUS,...)

> nrow(Grouped_Data)
[1] 1660

由我想要的组组成,但现在我想为每个组创建一个新的数据帧,其中包含属于每个组的所有条目。我尝试过使用split函数:

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: 

现在我想采用非空数据帧,将它们重命名为,例如,&#39; 1.A1.ABC.Less比10.N&#39; (或类似的东西)并将其存储到全球环境中。

我知道这可以使用子集来完成,例如:

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

等等,但这对于所需的子集数量是不实际的。

任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分: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)以创建唯一的变量名称。 *请注意,我使用DURATIONgsub移除了空格,并在newnames前加Z,因为R不喜欢以数字开头的变量名称:< / p>

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