我试图根据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" & .....)
等等,但这对于所需的子集数量是不实际的。
任何帮助将不胜感激,谢谢。
答案 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
)以创建唯一的变量名称。 *请注意,我使用DURATION
从gsub
移除了空格,并在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]]) }