![](/img/trans.png)
[英]Is there a better (i.e vectorised) way to put part of a column name into a row of a data frame in R
[英]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.