检查连续元素(即列)中的变化,忽略数据帧中的NA

时间:2018-06-11 13:13:24

标签: r match row apply

我试图检查给定行中的元素是否不同。

例如,

> s <- as.data.frame(matrix(ncol=10, nrow=3, 
+                            c(0,NA,NA,1,1,NA,0,NA,NA,NA,NA,NA,0,NA,0,0,NA,NA,0,0,NA,NA,0,0,0,1,1,NA,NA,NA), byrow = TRUE))

> s
  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1  0 NA NA  1  1 NA  0 NA NA  NA
2 NA NA  0 NA  0  0 NA NA  0   0
3 NA NA  0  0  0  1  1 NA NA  NA

这是我的数据框,我想看看是否在连续的逐行中忽略NA值,从“0”到“1”有任何变化。输出应该是例如给定示例的向量v <-c("TRUE","FALSE","TRUE")。有没有简单的解决方案?

3 个答案:

答案 0 :(得分:2)

如果您确实关心序列0:1是否存在,而不仅仅是否存在非零差异,您可以

library(zoo)
apply(s, 1, function(x) 'TRUE' %in% rollapply(x[!is.na(x)], 2, all.equal, 0:1, 
                                              check.attributes = F))
#[1]  TRUE FALSE  TRUE

说明我的意思:

s[2,5] <- -1
apply(s, 1, function(x) any(diff(x[!is.na(x)]) != 0)) # Rui
# [1] TRUE TRUE TRUE
apply(s, 1, function(x) 'TRUE' %in% rollapply(x[!is.na(x)], 2, all.equal, 0:1, 
                                              check.attributes = F))
# [1]  TRUE FALSE  TRUE

答案 1 :(得分:1)

以下是您所描述的内容。

v <- apply(s, 1, function(x) any(diff(x[!is.na(x)]) != 0))
v
#[1]  TRUE FALSE  TRUE

答案 2 :(得分:1)

这是一个基本的R方法,它在删除缺失值后将值粘贴在一起,然后使用grepl在结果字符串中搜索“01”。

apply(t(s), 2,
      function(x) grepl("01", paste(x[!is.na(x)], collapse=""), fixed=TRUE))
[1]  TRUE FALSE  TRUE

请注意,我转换了您的数据集,因为逐列操作往往更有效,尽管这可能无关紧要。