我有一个数据框,如下所示:
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)
你在找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)