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这不是我的问题。我写的,我认为有点笨重,因为它的重复性。