检查数据框中的所有值是否满足条件(条件是向量)

Bar*_*nka 1 r matrix

我有一个数据框,如下所示:

muestra[1:10,2:5]
##       X0 X1 X2 X3
## 21129  0  0  0  0
## 34632  0  0  0  0
## 30612  0  0  0  0
## 10687  0  0  1  2
## 44815  0  0  0  1
## 40552  0  0  0  1
## 15311  0  0  0  0
## 33960  0  0  0  0
## 24073  0  0  0  0
## 13077  0  0  0  0
Run Code Online (Sandbox Code Playgroud)

我正在比较特定值的向量的行:

muestra[1:10,2:5] == c(0,0,0,0)
##         X0   X1    X2    X3
## 21129 TRUE TRUE  TRUE  TRUE
## 34632 TRUE TRUE  TRUE  TRUE
## 30612 TRUE TRUE  TRUE  TRUE
## 10687 TRUE TRUE FALSE FALSE
## 44815 TRUE TRUE  TRUE FALSE
## 40552 TRUE TRUE  TRUE FALSE
## 15311 TRUE TRUE  TRUE  TRUE
## 33960 TRUE TRUE  TRUE  TRUE
## 24073 TRUE TRUE  TRUE  TRUE
## 13077 TRUE TRUE  TRUE  TRUE
Run Code Online (Sandbox Code Playgroud)

比较矢量的值可能会改变; 即它可以是c(0,0,1,0),c(1,2,1,2),等等.

我想检查整排是否符合条件; 是否有一个返回这样的函数:

some_function(muestra[1:10,2:5], c(0,0,0,0))
##        some_function(muestra[1:10,2:5], c(0,0,0,0))
## 21129                                       TRUE
## 34632                                       TRUE
## 30612                                       TRUE
## 10687                                      FALSE
## 44815                                      FALSE
## 40552                                      FALSE
## 15311                                       TRUE
## 33960                                       TRUE
## 24073                                       TRUE
## 13077                                       TRUE
Run Code Online (Sandbox Code Playgroud)

李哲源*_*李哲源 5

你在找all().适用all()于每一行.

让我们考虑一个更通用的目标向量,比如说y <- c(0,0,1,0),然后我们可以做到:

x <- muestra[1:10,2:5]
apply(x == rep(y, each = nrow(x)), 1, all)
Run Code Online (Sandbox Code Playgroud)

apply效率低,因为它没有矢量化.如果我要做这份工作,我会选择rowSums().我会用:

rowSums(x == rep(y, each = nrow(x))) == ncol(x)
Run Code Online (Sandbox Code Playgroud)

我也很高兴做出基准.我第一次知道有一个功能col.但似乎使用rep效率稍高:

set.seed(123)
x <- matrix(sample(1e7), ncol = 10)
y <- sample(10)

library(microbenchmark)
microbenchmark("  ZL_apply:" = apply(x == rep(y, each = nrow(x)), 1, all),
               "ZL_rowSums:" = rowSums(x == rep(y, each = nrow(x))) == ncol(x),

               "        DA:" = rowSums(x == y[col(x)]) == ncol(x))

Unit: milliseconds
        expr       min        lq      mean    median        uq       max neval
   ZL_apply: 3278.6738 3312.5376 3349.2760 3347.4750 3378.5720 3506.4211   100
 ZL_rowSums:  314.2683  318.1528  331.2623  324.5413  336.5447  427.5261   100
         DA:  422.7039  432.3683  461.4871  461.8067  476.1305  624.4142   100
Run Code Online (Sandbox Code Playgroud)