【问题标题】:How to generate multiple data frames in a loop如何在循环中生成多个数据帧
【发布时间】:2019-03-25 00:13:02
【问题描述】:

我想基于一个大数据帧 (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"))

【问题讨论】:

    标签: r


    【解决方案1】:

    我建议使用列表来保持结果数据框的有序性。这是使用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
    

    【讨论】:

      【解决方案2】:

      有很多方法可以做到这一点。 使您的代码如下所示:

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-02
        • 1970-01-01
        • 2018-11-13
        • 2019-11-23
        • 2021-04-19
        • 2013-11-13
        相关资源
        最近更新 更多