使用Split在R中创建新的数据帧,并基于可变条件重命名
我正试图根据R中的一些条件将一个大数据帧分割成更小的数据帧。 我希望这些数据帧中的每一个都能根据它们被分割的变量来命名,但是由于有超过1660个新的“子”数据帧,我无法手动进行命名 整个数据帧的一个示例:使用Split在R中创建新的数据帧,并基于可变条件重命名,r,dataframe,split,subset,rename,R,Dataframe,Split,Subset,Rename,我正试图根据R中的一些条件将一个大数据帧分割成更小的数据帧。 我希望这些数据帧中的每一个都能根据它们被分割的变量来命名,但是由于有超过1660个新的“子”数据帧,我无法手动进行命名 整个数据帧的一个示例: ID LENGTH GRADE CODE DURATION STATUS 1 1 A1 ABC Less than 10 Y 2 2 A1 ABC
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
有超过900000个条目被7个变量分成大约1660个非空组——我通过创建一个新的分组数据框发现了这一点
> Grouped_DF<- DF %>% group_by(LENGTH,GRADE,CODE,DURATION,STATUS,...)
> nrow(Grouped_Data)
[1] 1660
输出的一个示例:
> SplitGroups
$1.A1.ABC.Less Than 10.N`
# A tibble: 10 x 65
# Groups: ID [10]
# ... with 65 variables:
现在我想将非空数据帧重命名为,例如,“1.A1.ABC.小于10.N”(或类似名称),并将其存储到全局环境中
我知道这可以使用子集来完成,例如:
1.A1.ABC.LessThan10.N <- subset(DF, LENGTH==1 & GRADE=="A1" & CODE=="ABC" & .....)
1.A1.ABC.LessThan10.N我还建议将您的数据帧保存在列表中,但这里有一个解决方案
您的数据:
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)
将数据框拆分为一个列表(正如您已经做的…)
splitGroups 0]
将删除所有空的data.frames。将其存储在列表中可能是更好的方法,因为更容易系统地与data.frames交互。请参阅一些技巧。我们可以使用Filter(函数(x)nrow(x)>0,splitGroups)
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)
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)
for (I in 1:length(split.df)) { assign(unique(split.df[[I]]$newnames), split.df[[I]]) }