代码之家  ›  专栏  ›  技术社区  ›  RTrain3k

函数迭代创建数据帧的子集

  •  2
  • RTrain3k  · 技术社区  · 7 年前

    data frame 来自用户提供的列向量的子集以及每个列中的值列表。

    示例数据帧:

    df <- data.frame(var1 = rep(1:3, each = 5),
                     var2 = rep(4:6, each = 5), 
                     var3 = rep(7:9, each = 5))
    

    要子集的列向量: cols.df <- c(1,2,3)

    每个列中的值列表,其子集为: rows.df <- list(c(1:3), c(4:6), c(7:9))

    函数以迭代方式创建子集列表:

    subsetfcn <- function(data, cols, rowslist){
    
      df <- data 
      listofdfs <- list() # create data.frame to contain subsets
    
      for(a in cols){
        for(rows in rowslist) {
          for(row in rows) {
            df <- df[df[ , a]==row, ]
            listofdfs[[row]] <- df
          }
        }
      }
      return(listofdfs)
    }
    
    results <- subsetfcn(df, cols.df, rows.df)
    

    预期输出如下:

    > df[df[ , 1]==1, ]
      var1 var2 var3
    1    1    4    7
    2    1    4    7
    3    1    4    7
    4    1    4    7
    5    1    4    7
    > df[df[ , 1]==2, ]
       var1 var2 var3
    6     2    5    8
    7     2    5    8
    8     2    5    8
    9     2    5    8
    10    2    5    8
    > df[df[ , 1]==3, ]
       var1 var2 var3
    11    3    6    9
    12    3    6    9
    13    3    6    9
    14    3    6    9
    15    3    6    9
    > 
    > df[df[ , 2]==4, ]
      var1 var2 var3
    1    1    4    7
    2    1    4    7
    3    1    4    7
    4    1    4    7
    5    1    4    7
    > df[df[ , 2]==5, ]
       var1 var2 var3
    6     2    5    8
    7     2    5    8
    8     2    5    8
    9     2    5    8
    10    2    5    8
    > df[df[ , 2]==6, ]
       var1 var2 var3
    11    3    6    9
    12    3    6    9
    13    3    6    9
    14    3    6    9
    15    3    6    9
    

    到目前为止,函数返回一个包含9个数据帧的列表,但每个帧都没有行。我不知道为什么没有传递正确的值 a row

    1 回复  |  直到 7 年前
        1
  •  2
  •   zx8754    7 年前

    使用 mapply公司 :

    res <- unlist(
      mapply(function(cols.df, rows.df){
        lapply(rows.df, function(x){ df[ df[ , cols.df ] == x, ] })
    
      }, cols.df, rows.df, SIMPLIFY = FALSE),
      recursive = FALSE)
    
    
    # check output
    length(res)
    # [1] 9
    
    res[1:2]
    # [[1]]
    # var1 var2 var3
    # 1    1    4    7
    # 2    1    4    7
    # 3    1    4    7
    # 4    1    4    7
    # 5    1    4    7
    # 
    # [[2]]
    # var1 var2 var3
    # 6     2    5    8
    # 7     2    5    8
    # 8     2    5    8
    # 9     2    5    8
    # 10    2    5    8