2016-08-02 46 views
0

我有一个数据帧,其看起来如下:检查是否在数据帧中的所有的值满足条件(条件是载体)

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 

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

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 

比较矢量的值可能会改变;即它可以是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 

回答

5

您正在寻找all()。将all()应用于每一行。

让我们考虑一个更一般的目标向量,说y <- c(0,0,1,0),那么我们可以这样做:

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

apply是低效的,因为它没有量化。如果我要做这项工作,我会选择rowSums()。我会用:

rowSums(x == rep(y, each = nrow(x))) == ncol(x) 

我很乐意做一个标杆了。我第一次知道有一个功能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 
+1

@Barranka结合col,太:它不应该是'申请(muestra,函数(x)的所有(X = = c(0,0,0,0)))'; 'apply(muestra == c(0,0,0,0),1,all)'使每列的下方有== ==比较,而不是每行下来。例如,对于'dat = data.frame(x = c(1,1),y = c(2,2))','dat == 1:2' VS't(apply(dat,1,“= =“,1:2))' –

+0

不错的选择,加上一个给你和另一个帖子。 – akrun

3

原谅我不喜欢用行操作。我会rowSums代替

rowSums(df == c(0,0,0,0)[col(df)]) == ncol(df) 
# 21129 34632 30612 10687 44815 40552 15311 33960 24073 13077 
# TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE TRUE 

一些基准

set.seed(123) 
df <- as.data.frame(matrix(sample(1e7), ncol = 10)) 
vec <- sample(10) 

library(microbenchmark) 
microbenchmark("ZL: " = apply(df== vec, 1, all), 
       "DA: " = rowSums(df == vec[col(df)]) == ncol(df)) 

# Unit: milliseconds 
# expr  min  lq  mean median  uq  max neval cld 
# ZL: 2262.580 2386.5286 2421.7244 2420.6767 2454.1483 2592.888 100 b 
# DA: 786.121 807.1531 836.7408 827.1577 849.9955 1038.139 100 a 
+2

只需要注意一下,以“data.frame”,“Reduce(”&“,Map(”==“,df,vec))== ncol(df)''为例,并创建第二个dim(df)对象('vec [col(df)]')。也许值得,也只是'compiler :: cmpfun'一个简单的'for(我在seq_along(df))ans = ans&(df [[i]] == vec [[i]]) –