使用拆分在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" & .....)
等等,但是这不是必要的子集数有实际。
任何帮助,将不胜感激,谢谢。
答
我还建议让您的数据帧在列表中,但这里是你想要的
你的数据有什么解决办法:
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]]) }
'splitGroups 0]'将删除所有空的data.frames。将它存储在列表中可能是更好的方法,因为它更容易与数据框架系统地交互。看到这里的[gregor的帖子](https://stackoverflow.com/questions/17499013/how-do-i-make-a-list-of-data-frames)上的一些技巧。 – lmo
我们可以使用'Filter(function(x)nrow(x)> 0,splitGroups)' – akrun