高效等同于 ifelse 但在 R 中有一个选项?

Efficient equivalent to ifelse but with one option in R?

# Two Ordered Vectors

sequenceA <- c(1, 2, NA, 4)
sequenceB <- c(4, 2, NA, 1) 

df <- data.frame(sequenceA, sequenceB)


sum(ifelse(!is.na(df[1,]), 888, 1) == ifelse(!is.na(df[2,]), 999, 1)) # Number of NA values that are in the same position
#? Number of non-NA values that are in the same position

假设我在一个数据框中有两个观察结果,我想比较它们的相似程度。我特别想知道两件事:他们有多少共同的特定变量的缺失值,以及他们有多少共同的特定变量的非缺失值[= =31=]。

据我所知,intersect%in%match 函数都没有用为此目的,因为他们不考虑值的顺序,仅当它们在集合中找到时才考虑。

我提供了一个检查 NA 值的单行解决方案,方法是用数字替换(否则它只是 returns NA)。然后我只想比较非 NA 值之间的重叠,因此我想用一个占位符值(例如“555”)替换 sequenceA 的 NA 和 sequenceB 具有一个不同的占位符值(例如“666”)。

我正在寻找一个单行解决方案:如果没有 elseifelse 的等价物19=]do nothing 选项,我很容易就能看到。大多数解决此问题的类似问题得到的答复只是对向量进行子集化并重新分配 (<-) 一个值或使用 if(){} 命令,这使得解决方案过长(特别是如果这是我发现自己通常想做的事情)。我是否缺少 R 中针对此类问题的最佳实践解决方案?

要获取它们共有的特定变量的缺失值,您可以使用

sum(is.na(df$sequenceA) & is.na(df$sequenceB))
#[1] 1

这也可以理解为位于同一位置的 NA 个值的数量。


获取特定变量的共同非缺失值的数量

sum(!is.na(df$sequenceA) & !is.na(df$sequenceB))
#[1] 3

这也可以理解为位于同一位置的非NA值的数量。


要检查相同的值,我们可以这样做

sum(df$sequenceA == df$sequenceB, na.rm = TRUE)