首页 > 解决方案 > 等效于 ifelse 但在 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

假设我在数据框中有两个观察结果,我想比较它们的相似程度。我想具体了解两件事:它们共有多少特定变量的缺失值,以及它们共有的特定变量有多少非缺失值

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

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

我正在寻找一个单行的解决方案:如果有一个相当于ifelse而没有else什么都不做的选项,我可以很容易地看到它。解决此问题的大多数类似问题都会得到答复,只需对向量进行子集化并重新分配 ( <- ) 值或使用if(){}命令,这会使解决方案过长(特别是如果这是我自己发现的问题平时想做)。我是否错过了 R 中针对此类问题的最佳良好实践解决方案?

标签: rif-statementcomparison

解决方案


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

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)

推荐阅读