R 简化调用,对函数中的一个变量使用多个逻辑条件,同时只调用一次变量

R 简化调用,对函数中的一个变量使用多个逻辑条件,同时只调用一次变量,r,optimization,R,Optimization,受此启发,我试图简化一个,它调用以避免调用数据帧,这里是mtcars,而我正在调节的变量,这里是cyl,不止一次 说这是我的密码 mtcars[with(mtcars, which(cyl == gear | cyl == carb)), ] 这里我调用了两次数据帧,变量cyl也被调用了两次。我想有一种简单的方法可以用%c(carb,gear)或者类似的东西来写一行很长的cyl% 主要的想法是,我正在寻找一种方法,在我的通话中只声明一次mtcars、cyl、齿轮、和carb 我知道这很简单,但

受此启发,我试图简化一个
,它调用
以避免调用数据帧,这里是
mtcars
,而我正在调节的变量,这里是
cyl
,不止一次

说这是我的密码

mtcars[with(mtcars, which(cyl == gear | cyl == carb)), ]
这里我调用了两次数据帧,变量
cyl
也被调用了两次。我想有一种简单的方法可以用%c(carb,gear)
或者类似的东西来写一行很长的
cyl%

主要的想法是,我正在寻找一种方法,在我的通话中只声明一次mtcars
cyl
齿轮
、和
carb


我知道这很简单,但这只是为了说明问题。如果您想学习更详细的示例,请查看上面链接的问题。

查看
数据。表

require(data.table)
as.data.table(mtcars, keep.rownames = T)[cyl == gear | cyl == carb,]
#                 rn  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#  1:     Datsun 710 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#  2:      Merc 240D 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#  3:       Merc 230 22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#  4:       Fiat 128 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
#  5:    Honda Civic 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
#  6: Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#  7:      Fiat X1-9 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
#  8:   Ferrari Dino 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
#  9:  Maserati Bora 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
# 10:     Volvo 142E 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

查看数据表

require(data.table)
as.data.table(mtcars, keep.rownames = T)[cyl == gear | cyl == carb,]
#                 rn  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#  1:     Datsun 710 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#  2:      Merc 240D 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#  3:       Merc 230 22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#  4:       Fiat 128 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
#  5:    Honda Civic 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
#  6: Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#  7:      Fiat X1-9 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
#  8:   Ferrari Dino 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
#  9:  Maserati Bora 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
# 10:     Volvo 142E 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

使用
dplyr

library(dplyr)
mtcars %>% mutate(rownames = rownames(.)) %>% filter(cyl == gear | cyl == carb)

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb       rownames
1  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1     Datsun 710
2  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2      Merc 240D
3  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2       Merc 230
4  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1       Fiat 128
5  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2    Honda Civic
6  33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1 Toyota Corolla
7  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1      Fiat X1-9
8  19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6   Ferrari Dino
9  15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8  Maserati Bora
10 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2     Volvo 142E

如果不需要行名称:

mtcars %>% filter(cyl == gear | cyl == carb)

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
2  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
3  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
4  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
5  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
6  33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
7  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
8  19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
9  15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
10 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

但是我不认为有什么方法可以简化
(cyl==gear | cyl==carb)
,所以它只调用cyl一次。

使用
dplyr

library(dplyr)
mtcars %>% mutate(rownames = rownames(.)) %>% filter(cyl == gear | cyl == carb)

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb       rownames
1  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1     Datsun 710
2  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2      Merc 240D
3  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2       Merc 230
4  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1       Fiat 128
5  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2    Honda Civic
6  33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1 Toyota Corolla
7  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1      Fiat X1-9
8  19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6   Ferrari Dino
9  15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8  Maserati Bora
10 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2     Volvo 142E

如果不需要行名称:

mtcars %>% filter(cyl == gear | cyl == carb)

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
2  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
3  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
4  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
5  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
6  33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
7  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
8  19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
9  15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
10 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

但我认为没有办法简化
(cyl==gear | cyl==carb)
,因此它只调用cyl一次。

考虑基本R,将每个过滤器与
do.call(rbind,…)
叠加:


通过使用
do.call(rbind,…)
堆叠每个过滤器,考虑基本R:


子集(mtcars,cyl==gear | cyl==carb)
也会更短,更详细的例子是:
mtcars[rowSums(mtcars[cols]==mtcars$cyl)>0,]
其中
cols
包含感兴趣的列你为什么问这个问题?看起来你在前面的问题中得到了很好的答案。。。使用them@minem这不是我的问题。我写了一个我认为有点笨重的例子,因为它的重复性。
子集(mtcars,cyl==gear | cyl==carb)
也会更短,作为一个更详细的例子:
mtcars[行和(mtcars[cols]==mtcars$cyl)>0,]
其中
cols
包含感兴趣的列你为什么问这个问题?看起来你在前面的问题中得到了很好的答案。。。使用them@minem这不是我的问题。我写的,我认为有点笨重,因为它的重复性。