我希望使用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个计数。
答案 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(即循环),请查看lapply
或sapply
。
答案 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
个对象。我无法让它发挥作用。