2014-11-24 80 views
0

我試圖找出如何做一些數據質量上的代碼檢查清單。應用is.logical與多種數據類型

假設我有

x <- list(1,2,T) 
y <- list(1,2,3) 

我希望能夠給應用功能,這將標誌「X」作爲有壞的數據。

if(any(is.logical(x))) stop('Bad data') 

if(any(is.logical(y))) 

不會觸發錯誤。

我知道我可以用它做的for循環,但我希望能找到一個簡單的解決方案。

For循環解

for (tmp in x) {if (is.logical(tmp)) stop('Bad data')} 
+1

這是使用'sapply'到vectorise功能的應用中,嘗試:'任何(sapply(X,is.logical))'' – Alex 2014-11-24 03:16:52

回答

2

的解決方案是使用sapply。

> any(sapply(x,is.logical)) 
[1] TRUE 

> any(sapply(y,is.logical)) 
[1] FALSE 

請注意,使用任何和sapply比使用for循環要慢得多。

> system.time(any(sapply(x,is.logical))) 
    user system elapsed 
    1.58 0.02 1.61 

> system.time(for (blah in x) {if(is.logical(x)) {}}) 
    user system elapsed 
    0.29 0.00 0.29 

使用vapply如下面推薦

> system.time(any(vapply(x, is.logical, logical(1)))) 
    user system elapsed 
    0.30 0.01 0.28 
+3

sapply'由於運行'simpl2array',速度較慢。相反,任何(vapply(x,is.logical,logical(1L)))'將會像for循環一樣執行。 – flodel 2014-11-24 03:33:46