获取 20 多个数据子集?

Take 20+ subsets of data?

我有一个数据集,想根据各种列、值和条件运算符获取大量子集。我认为最理想的输出是一个列表,其中包含所有这些子集数据帧作为列表中的单独元素。我试图通过构建一个包含我想使用的子集条件的数据框,构建一个函数,然后使用 apply 将该数据框提供给函数来实现这一点,但这没有用。我确信可能有更好的方法使用匿名函数或类似的东西,但我不确定我将如何实现它。下面是一个应该产生 8 个数据子集的示例代码。

原始数据集,其中 x1 和 x2 在不会用于子集化的项目上评分,RT 和 LS 是将作为子集的变量:

df <- data.frame(x1 = rnorm(100),
                 x2 = rnorm(100),
                 RT = abs(rnorm(100)),
                 LS = sample(1:10, 100, replace = T))

包含子集条件的数据框。例如,数据的第一个子集应该是 RT 列中值大于或等于 0.5 的任何观察值,第二个子集应该是子集列中大于或等于 1 的任何观察值,等等。应该有 8 个子集, 4 个在 RT 变量上完成,4 个在 LS 变量上完成。

subsetConditions <- data.frame(column = rep(c("RT", "LS"), each = 4),
                      operator = rep(c(">=", "<="), each = 4),
                      value = c(0.5, 1, 1.5, 2,
                                9, 8, 7, 6))

这是我为尝试执行此操作而编写的丑陋函数:

subsetFun <- function(x){
  subset(df, eval(parse(text = paste(x))))
}  

subsets <- apply(subsetConditions, 1, subsetFun)

感谢您的帮助!

你的功能其实已经很接近了,只是需要做一些调整。因此,对于每一行 paste,您需要折叠所有 3 列,使其只有 1 个字符串而不是 3 个,然后它才能正确计算表达式。

subsetFun <- function(x){
  subset(df, eval(parse(text = paste(x, collapse = ""))))
}  

subsets <- apply(subsetConditions, 1, subsetFun)

输出

然后,它将return这8个子集。

str(subsets)

List of 8
 $ :'data.frame':   67 obs. of  4 variables:
  ..$ x1: num [1:67] -1.208 0.606 -0.17 0.728 -0.424 ...
  ..$ x2: num [1:67] 0.4058 -0.3041 -0.3357 0.7904 -0.0264 ...
  ..$ RT: num [1:67] 1.972 0.883 0.598 0.633 1.517 ...
  ..$ LS: int [1:67] 8 9 2 10 8 5 3 4 7 2 ...
 $ :'data.frame':   35 obs. of  4 variables:
  ..$ x1: num [1:35] -1.2083 -0.4241 -0.0906 0.9851 -0.8236 ...
  ..$ x2: num [1:35] 0.4058 -0.0264 1.0054 0.0653 1.4647 ...
  ..$ RT: num [1:35] 1.97 1.52 1.05 1.63 1.47 ...
  ..$ LS: int [1:35] 8 8 5 4 7 3 1 6 8 6 ...
 $ :'data.frame':   16 obs. of  4 variables:
  ..$ x1: num [1:16] -1.208 -0.424 0.985 0.99 0.939 ...
  ..$ x2: num [1:16] 0.4058 -0.0264 0.0653 0.3486 -0.7562 ...
  ..$ RT: num [1:16] 1.97 1.52 1.63 1.85 1.8 ...
  ..$ LS: int [1:16] 8 8 4 6 10 2 6 6 3 9 ...
 $ :'data.frame':   7 obs. of  4 variables:
  ..$ x1: num [1:7] 0.963 0.423 -0.444 0.279 0.417 ...
  ..$ x2: num [1:7] 0.6612 0.0354 0.0555 0.1253 -0.3056 ...
  ..$ RT: num [1:7] 2.71 2.15 2.05 2.01 2.07 ...
  ..$ LS: int [1:7] 2 6 9 9 7 7 4
 $ :'data.frame':   91 obs. of  4 variables:
  ..$ x1: num [1:91] -0.952 -1.208 0.606 -0.17 -0.048 ...
  ..$ x2: num [1:91] -0.645 0.406 -0.304 -0.336 -0.897 ...
  ..$ RT: num [1:91] 0.471 1.972 0.883 0.598 0.224 ...
  ..$ LS: int [1:91] 6 8 9 2 1 8 4 5 3 4 ...
 $ :'data.frame':   75 obs. of  4 variables:
  ..$ x1: num [1:75] -0.952 -1.208 -0.17 -0.048 -0.424 ...
  ..$ x2: num [1:75] -0.6448 0.4058 -0.3357 -0.8968 -0.0264 ...
  ..$ RT: num [1:75] 0.471 1.972 0.598 0.224 1.517 ...
  ..$ LS: int [1:75] 6 8 2 1 8 4 5 3 4 1 ...
 $ :'data.frame':   65 obs. of  4 variables:
  ..$ x1: num [1:65] -0.9517 -0.1698 -0.048 0.2834 -0.0906 ...
  ..$ x2: num [1:65] -0.645 -0.336 -0.897 -2.072 1.005 ...
  ..$ RT: num [1:65] 0.471 0.598 0.224 0.486 1.053 ...
  ..$ LS: int [1:65] 6 2 1 4 5 3 4 1 7 4 ...
 $ :'data.frame':   58 obs. of  4 variables:
  ..$ x1: num [1:58] -0.9517 -0.1698 -0.048 0.2834 -0.0906 ...
  ..$ x2: num [1:58] -0.645 -0.336 -0.897 -2.072 1.005 ...
  ..$ RT: num [1:58] 0.471 0.598 0.224 0.486 1.053 ...
  ..$ LS: int [1:58] 6 2 1 4 5 3 4 1 4 2 ...

考虑没有任何 eval + parseMapmapply 的包装)。由于 ==<=>= 和其他运算符可以用作具有两个参数的函数,其中 4 <= 5 可以写成 `<=`(4,5)"<="(4, 5), 只需按元素传递参数并使用 get 通过字符串引用函数:

sub_data <- function(col, op, val) {
  df[get(op)(df[[col]], val),]
}

sub_dfs <- with(subsetConditions, Map(sub_data, column, operator, value))

输出

str(sub_dfs)
List of 8
 $ RT:'data.frame': 62 obs. of  4 variables:
  ..$ x1: num [1:62] -1.12 -0.745 -1.377 0.848 1.63 ...
  ..$ x2: num [1:62] -0.257 -2.385 0.805 -0.313 0.662 ...
  ..$ RT: num [1:62] 0.693 1.662 0.731 2.145 0.543 ...
  ..$ LS: int [1:62] 5 5 1 2 9 1 5 9 3 10 ...
 $ RT:'data.frame': 36 obs. of  4 variables:
  ..$ x1: num [1:36] -0.745 0.848 0.908 -0.761 0.74 ...
  ..$ x2: num [1:36] -2.3849 -0.3131 -2.4645 -0.0784 0.8512 ...
  ..$ RT: num [1:36] 1.66 2.15 1.74 1.65 1.13 ...
  ..$ LS: int [1:36] 5 2 1 5 9 10 2 7 1 3 ...
 $ RT:'data.frame': 14 obs. of  4 variables:
  ..$ x1: num [1:14] -0.745 0.848 0.908 -0.761 -1.063 ...
  ..$ x2: num [1:14] -2.3849 -0.3131 -2.4645 -0.0784 -2.9886 ...
  ..$ RT: num [1:14] 1.66 2.15 1.74 1.65 2.63 ...
  ..$ LS: int [1:14] 5 2 1 5 5 6 9 4 8 4 ...
 $ RT:'data.frame': 3 obs. of  4 variables:
  ..$ x1: num [1:3] 0.848 -1.063 0.197
  ..$ x2: num [1:3] -0.313 -2.989 0.709
  ..$ RT: num [1:3] 2.15 2.63 2.05
  ..$ LS: int [1:3] 2 5 6
 $ LS:'data.frame': 92 obs. of  4 variables:
  ..$ x1: num [1:92] -1.12 -0.745 -1.377 0.848 0.612 ...
  ..$ x2: num [1:92] -0.257 -2.385 0.805 -0.313 0.958 ...
  ..$ RT: num [1:92] 0.693 1.662 0.731 2.145 0.489 ...
  ..$ LS: int [1:92] 5 5 1 2 1 9 1 5 9 3 ...
 $ LS:'data.frame': 78 obs. of  4 variables:
  ..$ x1: num [1:78] -1.12 -0.745 -1.377 0.848 0.612 ...
  ..$ x2: num [1:78] -0.257 -2.385 0.805 -0.313 0.958 ...
  ..$ RT: num [1:78] 0.693 1.662 0.731 2.145 0.489 ...
  ..$ LS: int [1:78] 5 5 1 2 1 1 5 3 5 2 ...
 $ LS:'data.frame': 75 obs. of  4 variables:
  ..$ x1: num [1:75] -1.12 -0.745 -1.377 0.848 0.612 ...
  ..$ x2: num [1:75] -0.257 -2.385 0.805 -0.313 0.958 ...
  ..$ RT: num [1:75] 0.693 1.662 0.731 2.145 0.489 ...
  ..$ LS: int [1:75] 5 5 1 2 1 1 5 3 5 2 ...
 $ LS:'data.frame': 62 obs. of  4 variables:
  ..$ x1: num [1:62] -1.12 -0.745 -1.377 0.848 0.612 ...
  ..$ x2: num [1:62] -0.257 -2.385 0.805 -0.313 0.958 ...
  ..$ RT: num [1:62] 0.693 1.662 0.731 2.145 0.489 ...
  ..$ LS: int [1:62] 5 5 1 2 1 1 5 3 5 2 ...