【问题标题】:Function to iteratively create subsets of data frame迭代创建数据框子集的函数
【发布时间】:2018-11-21 22:06:53
【问题描述】:

我正在尝试开发一个函数,该函数从用户提供的列向量和每列中的值列表创建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 &lt;- c(1,2,3)

每列中的值列表以通过以下方式子集:rows.df &lt;- 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

【问题讨论】:

  • 预期输出是什么?
  • @zx8754 我已经更新了问题以包含预期的输出。
  • @RTrain3k 我不太明白输出。您是否尝试根据列或列索引的值进行子集化?预期的输出似乎是前者。
  • 也许是这个? lapply(df, function(i) split(df, i))
  • @Gautam 我经常需要根据某些列的值创建许多数据框子集。在上面的示例中,我需要创建 9 个数据框的函数。一个用于第一列的每个值,一个用于第二列的每个值,一个用于第三列的每个值。如果我明确地这样做,代码将是:df[df[ , 1]==1, ] df[df[ , 1]==2, ] df[df[ , 1]==3, ] df[df[ , 2]==4, ] df[df[ , 2]==5, ] df[df[ , 2]==6, ] df[df[ , 3]==7, ] df[df[ , 3]==8, ] df[df[ , 3]==9, ]

标签: r list function dataframe


【解决方案1】:

使用映射

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

【讨论】:

    猜你喜欢
    • 2018-12-24
    • 2018-04-12
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    相关资源
    最近更新 更多