我正试图弄清楚如何对代码进行一些数据质量检查。
假设我有
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 Loop Solution
for (tmp in x) {if (is.logical(tmp)) stop('Bad data')}
答案 0 :(得分:2)
解决方案是使用sapply。
> any(sapply(x,is.logical))
[1] TRUE
> any(sapply(y,is.logical))
[1] FALSE
请注意,使用any和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