我正在尝试根据向量中焦点值之前或之后的一个元素值来识别不匹配的值。关于如何操作有任何想法吗?
比方说,我有一个向量:x<-c(1,1,2,1,3,3)
。如果element[i]
与项目i
之前或之后的元素(element[i-1]
和element[i+1]
)匹配。如果存在匹配项element[i]
应该等于“是”,否则应该等于“否”。
x<-c(1,1,2,1,3,3)
的预期输出应为c("yes","yes","no","no","yes","yes")
。
答案 0 :(得分:7)
使用rle()
来确定相等值的游程。 rle(x)$length == 1
表示在当前值之前或之后没有相等的值。
rep(ifelse((len <- rle(x)$lengths) == 1, "no", "yes"), len)
# [1] "yes" "yes" "no" "no" "yes" "yes"
编辑:更简洁的版本(感谢 @dww的评论)
rep((len <- rle(x)$lengths) == 1, len)
# [1] FALSE FALSE TRUE TRUE FALSE FALSE
答案 1 :(得分:5)
为此可以使用diff
c(diff(x) == 0, F) | c(F, diff(x) == 0)
[1] TRUE TRUE FALSE FALSE TRUE TRUE
c(diff(x) == 0, F)
对于具有element [i] == element [i + 1]的每个索引为true(不适用于最后一个元素),c(F, diff(x) == 0)
对于具有element [i的每个索引都为true ] == element [i-1](不适用于第一个元素)
答案 2 :(得分:0)
这是一种基本的R方法。我们可以从原始输入向量生成偏移的向量,或者向左移动一个位置,或者向右移动一个位置。然后,我们可以断言原始向量中的每个位置是否与移位向量中的相同位置之一匹配。提供视觉效果:
x: [ 1, 1, 2, 1, 3, 3]
------------------------
x1: [NA, 1, 1, 2, 1, 3]
x2: [ 1, 2, 1, 3, 3, NA]
我们可以通过检查看到您期望的结果。这是实现此目的的代码片段:
x <- as.character(c(1,1,2,1,NA,NA))
x1 <- c('NA', x[1:length(x)-1])
x2 <- c(x[2:length(x)], 'NA')
result <- (x==x1 | is.na(x) & is.na(x1) | x==x2 | is.na(x) & is.na(x2))
output <- ifelse(is.na(result) | !result, "no", "yes")
output
[1] "yes" "yes" "no" "no" "yes" "yes"
请注意,我故意将您的数值向量转换为字符向量,以便可以使用字符串文字'NA'
作为缺失值的占位符。如果我们将上述逻辑与数字矢量一起使用,NA
可能会与实际缺失值发生冲突。
答案 3 :(得分:0)
这是一种方法(使用$ python
Python 2.7.15+ (default, Aug 31 2018, 11:56:52)
[GCC 8.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.sys.path.append('/usr/bin/')
>>> from scapy.all import *
和TRUE
代替FALSE
和"yes"
)。注释中的解释。
"no"