考虑R中的以下数据框,
df <- data.frame(ID = 1:7, Group = c(rep(1,2), rep(2, 3), rep(3,2)), Year = c(rep(2011, 4), rep(2012, 3)), X = rnorm(7))
我在基地R工作,希望以更有效的方式完成以下任务。
Group1 <- df[df$Group == 1,]
Group2 <- df[df$Group == 2,]
Group3 <- df[df$Group == 3,]
这里我按组生成三个独立的数据帧,并为变量名称提供系统命名方案。这段代码是重复的,我希望这样做的方式更好(通常我有更多的“组”,所以这些丑陋的重复代码行占用了很多空间)。
对于我自己的学习,我也很想看到一个这样的例子用于循环,即使我确定有更好的方法 - 有些东西:
for (i in 1:3){
Groupi <- df[df$Group == i,] }
虽然这显然不正确,但希望你能看到直觉。
任何更高效工作的例子都会受到赞赏,谢谢你。
答案 0 :(得分:2)
我认为如评论中所述,split
会更好。但是,使用assign
循环后,您可以实现自己的目标。
for (i in 1:3) {
assign(paste0("Group", i), df[df$Group==i,])
}
另外,小心索引,您需要一个逗号来表示&#34;所有列&#34;。
答案 1 :(得分:1)
以下是@Rupert答案的变体,其中一个自动从列中提取级别:
grep '\[6\]\[[0-3]\]' file
portStateReport[6][0].xxxx
例如,调用makeGroupVars <- function(baseName,df,column){
levs <- levels(as.factor(column))
for(lev in levs){
assign(paste0(baseName,lev),df[column == lev,],envir = .GlobalEnv)
}
NULL
}
将以预期的方式创建三个变量makeGroupVars("Group",df, df$Group)
。此外,"Group1", "Group2", "Group3"
(其中makeGroupVars("specie_",iris,iris$Species)
是内置示例数据框)等调用将能够创建iris
等变量。
完成所有这些后,我怀疑specie_setosa
的简单使用可能是最好的选择。你真的需要一个混乱的命名空间吗?