如何在循环中生成多个数据帧

时间:2019-03-24 15:54:47

标签: r

我想基于一个大数据帧(df0)生成多个数据帧(df1,df2等)。每个新数据框都应包含来自df0的某些列混合。

df0 <- data.frame(v0=c(0, 0), v1=c(3, 4), v2=c(5, 6), v3=c(7, 8))

for(i in 1:3) {
   secondcol <- colnames(df0[,..i])                  # I get an error here
   dfX = subset(df0, select = c("v0", secondcol))    # dfX should be df & i
}

# The for loop should replicate the following three comands:
df1 = subset(df0, select = c("v0", "v1"))
df2 = subset(df0, select = c("v0", "v2"))
df3 = subset(df0, select = c("v0", "v3"))

2 个答案:

答案 0 :(得分:0)

许多方法可以做到这一点。 要使代码按以下方式工作:

library(dplyr)
for(i in 1:3) {
  secondcol <- colnames(df0)[(i+1)]
  dat <- select(df0, c("v0", secondcol)) 
  assign(paste0("df", i), dat)
  rm(dat)
}

@Rich解决方案要好得多。 如果您仍然希望将它们作为环境中的数据框,则可以使用:

i <- 1:3
list2env(setNames(lapply(i+1, function(j) df0[c(1, j)]), paste0("df", i)), envir = .GlobalEnv)

答案 1 :(得分:0)

我建议使用列表来使结果数据框架井井有条。这是使用lapply()的方法。

i <- 1:3
setNames(lapply(i+1, function(j) df0[c(1, j)]), paste0("df", i))
# $df1
#   v0 v1
# 1  0  3
# 2  0  4
#
# $df2
#   v0 v2
# 1  0  5
# 2  0  6
#
# $df3
#   v0 v3
# 1  0  7
# 2  0  8