我试图检查给定行中的元素是否不同。
例如,
> 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 :(得分: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
请注意,我转换了您的数据集,因为逐列操作往往更有效,尽管这可能无关紧要。