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

时间:2018-06-12 13:23:29

标签: r list function dataframe

我正在尝试开发一个函数,该函数从用户提供的列向量和每列内的值列表中创建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个数据框的列表,但每个数据框都没有行。我不确定为什么没有将正确的值传递给arow

1 个答案:

答案 0 :(得分:2)

使用 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