繁体   English   中英

通过忽略数据帧中的NA来检查连续元素(即列)中的更改

[英]check changes in consecutive elements (i.e columns) by row ignoring NAs in a data frame

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

例如

> 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") 有没有简单的解决方案?

如果您实际上在乎序列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

以下是您描述的内容。

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

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

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

请注意,我对您的数据集进行了转置,因为按列进行操作通常会更高效,尽管在这里可能并不重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM