创建多个数据框并在循环内向其添加列

时间:2013-10-28 21:50:56

标签: r

我希望使用for循环创建多个数据框,并添加一列并从每个新数据框中删除其他数据。原始数据集看起来像这样:

Site  Count1  Count2  Count3  Count4  Count5  Count6  Count7  Count8  Count9  Habitat
  1     0       0       0       0       1       0        2       0       1     Forest
  2     1       2       3       0       0       2        0       1       0     Field
  3     2       0       0       1       1       1        0       2       0     Field

基本上我想为每个计数列创建一个新的数据框,所以在这里我将有九个新的数据框看起来像这样:

df.1:

Site TotCount Habitat
  1     0       Forest
  2     1       Field
  3     2       Field

df.2:

Site TotCount Habitat
  1     0       Forest
  2     2       Field
  3     0       Field

等等。

这会创建我需要的帧:

for (z in 1:9){       
  assign(paste("df",z,sep="."),orig_data)
}

我无法弄清楚第二步 - 将相应的计数与栖息地列(以及上面未显示的其他列)一起带入每个新数据框。我希望保持这种自动化,因为它可能有超过9个计数。

2 个答案:

答案 0 :(得分:4)

这将创建一个包含九个data.frames的列表,这对于(相信我)来说比在全局环境中创建九个变量要好得多:

data.list <- lapply(1:9, function(i) {
  setNames(data[c("Site", paste0("Count", i), "Habitat")],
           c("Site", "TotCount", "Habitat"))
})

您可以通过执行df.1来访问第一个data.frame,而不是data.list[[1]]。此外,如果要将函数应用于所有data.frames(即循环),请查看lapplysapply

答案 1 :(得分:0)

这会将df.x个对象放入全局环境中。

# example data
df <- data.frame(Site = 1:3, 
                 Count1 = 0:2, 
                 Count2 = c(0,2,0), 
                 Count3 = c(0,3,0), 
                 Habitat = c("Forest", "Field", "Field") 
                 )

完成工作的功能:

countSplit_2df <- function(DF){
    CountCols <- grep("Count", names(DF))
    HabCol <- grep("Habitat", names(DF))
    for (z in CountCols) {
        assign(paste("df", z, sep="."), 
               rbind(df[,c(1, z, HabCol)]),
               envir = .GlobalEnv)
    }
}

现在应用它:

countSplit_2df(df)

ls(),你会看到

> ls()
[1] "countSplit_2df" "df"             "df.2"           "df.3"          
[5] "df.4" 

请注意,这不是您要求的 ,因为我已使用grep中的列号命名它们。

要完成答案,有人需要在grep中的“计数”之后选择正确的方法 - 然后您可以使用它来标记df.x个对象。我无法让它发挥作用。