重复代码的效率 - 对于具有变量名称的循环

时间:2016-11-08 19:17:45

标签: r

考虑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,] }

虽然这显然不正确,但希望你能看到直觉。

任何更高效工作的例子都会受到赞赏,谢谢你。

2 个答案:

答案 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的简单使用可能是最好的选择。你真的需要一个混乱的命名空间吗?