我有一串0,1和NA,如下所示:
string<-c(0,1,1,0,1,1,NA,1,1,0,1,1,NA,1,0,
0,1,0,1,1,1,NA,1,0,1,NA,1,NA,1,0,1,0,NA,1)
我想计算模式"1-NA-1"发生的次数。 在这种情况下,我想得到计数 5。
我已经尝试了表(字符串),并试图复制它,但似乎没有任何效果。我将感谢任何人的帮助!
# some ugly code, but it seems to work
sum( head(string, -2) == 1 & is.na(head(string[-1],-1))
& string[-1:-2] == 1, na.rm = TRUE)
像这样:
x <- which(is.na(string))
x <- x[!x %in% c(1,length(string))]
length(x[string[x-1] & string[x+1]])
# [1] 5
--推理--
首先,我们检查string
的哪些值是用is.na(string)
NA
的。然后我们找到那些带有which
的索引并将它们存储在 x
.
正如@Rick提到的,如果第一个/最后一个值NA
则会导致我们下一步出现问题。因此,我们确保删除这些内容(因为它无论如何都不应该计算在内)。
接下来,我们要找到string[x-1]
和string[x+1]
都1
的情况。换句话说,1 & 1
.请注意,FALSE
和TRUE
可以分别评估为0
和1
。因此,如果您键入1 == TRUE
,您将获得TRUE
。如果您键入1 & 1
,您也会得到TRUE
。因此,当两者都1
时,string[x-1] & string[x+1]
将返回TRUE
,否则FALSE
。我们基本上得到一个逻辑向量,并用该向量进行子集x
,以获得满足我们搜索的x
中的所有位置。然后我们使用length
来确定有多少。