1

我想使用 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 个计数。

4

2 回答 2

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(即循环),请查看lapplyor sapply

于 2013-10-28T22:04:28.030 回答
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对象。我无法让它工作。

于 2013-10-28T22:16:37.290 回答