R - lapply() and DataFrame

  • 本文关键字:and DataFrame lapply r
  • 更新时间 :
  • 英文 :


是否可以使用lapply()动态获取条件,然后应用于数据框?出于演示目的,我简化了示例

例如

cond <- list("cyl==6", "mpg >= 21", "hp==110 & cyl==6")

我想在mtcars上应用所有条件,然后将输出存储到new_mtcars

我目前正在使用for循环,不确定这是否是一种有效的方法。

我不知道是否有基本的R解决方案(编辑:Suliman有(,但是rlang包中的parse_expr()可以这样做:

library(rlang)
library(dplyr)
cond <- list("cyl==6", "mpg >= 21", "hp==110 & cyl==6")
filter(mtcars, !! parse_expr(cond[[1]]))
mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
3 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
4 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
5 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
6 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
7 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6

并循环遍历每个条件,使用purrr::map

purrr::map(cond, ~ filter(mtcars, !! parse_expr(.x)))
[[1]]
mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
3 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
4 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
5 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
6 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
7 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
[[2]]
mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
5  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
6  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
7  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
8  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
9  33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
10 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
11 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
12 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
13 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
14 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
[[3]]
mpg cyl disp  hp drat    wt  qsec vs am gear carb
1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
3 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1

如果您更喜欢使用lapply(),则行lapply(cond, function(x) filter(mtcars, !! parse_expr(x)))将具有相同的输出。

如果要重新调整数据框,可以使用以下行。请注意set_names()的用法,以准确包含每行使用的条件:

purrr::map_dfr(purrr::set_names(cond), ~ filter(mtcars, !! parse_expr(.x)), .id = "cond")
cond  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1            cyl==6 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
2            cyl==6 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
3            cyl==6 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
4            cyl==6 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
5            cyl==6 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
6            cyl==6 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
7            cyl==6 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
8         mpg >= 21 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
9         mpg >= 21 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
10        mpg >= 21 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
11        mpg >= 21 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
12        mpg >= 21 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
13        mpg >= 21 22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
14        mpg >= 21 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
15        mpg >= 21 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
16        mpg >= 21 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
17        mpg >= 21 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
18        mpg >= 21 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
19        mpg >= 21 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
20        mpg >= 21 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
21        mpg >= 21 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
22 hp==110 & cyl==6 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
23 hp==110 & cyl==6 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
24 hp==110 & cyl==6 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1

最新更新