2016-08-02 45 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]]) –