gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:50:38 27 4
gpt4 key购买 nike

我正在尝试根据 R 中的一些条件将大数据帧拆分为更小的数据帧。我希望这些数据帧中的每一个都根据它们被拆分的变量命名,但是由于有超过 1660 个新的“子”数据帧,我无法手动执行此操作。

整个数据框的例子:

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

它由我想要的组组成,但现在我想为每个组创建一个新的数据框,其中包含属于每个组的所有条目。我试过使用拆分功能:

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" & .....) 

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

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

最佳答案

我还建议将您的数据框保存在列表中,但这是您想要的解决方案

您的数据:

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) 以创建唯一的变量名称。 *请注意,我使用 gsubDURATION 中删除了空格,并在 newnames 前面加上了 Z 因为 R 不喜欢以数字开头的变量名:

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

关于r - 使用 Split 在 R 中创建新数据框,并根据可变条件重命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45326363/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com