计算耐药菌携带的累积流行率

Calculate cumulative prevalence of carriage of resistant bugs

最近开始使用R,在做问题菌的携带工作时,遇到一个问题,希望有人能帮忙解决。如果问题比较简单,我们深表歉意。

我想计算在不同时间点(a、b、c)被问题 bug 殖民的人的累积比例,如“df”下方的数据集所示。 “0”表示阴性测试,“1”表示抗性错误测试阳性,“NA”表示在该时间点未进行测试。结果应如“x”中所述,即如果此人在任一时间点 (a、b、c) 测试呈阳性,则他在 x 中的值应为“1”。如果他所有的测试都是阴性,他的值应该是“0”,如果他从未做过测试,那么值应该是“NA”。有什么好的方法可以自动计算这个“x”吗?

a <- c(0, 0, 1, 0, 0, 1, 0, 0, NA, NA)
b <- c(0, 0, 1, 0, 1, NA, 0, 0, NA, 0)
c <- c(NA, 1, 0, 0, 0, 1, 1, 0, NA, 0)
df <- cbind(a, b, c)
df

x <- c(0, 1, 1, 0, 1, 1, 1, 0,NA,0)
df <- cbind(df, x)
df

我尝试使用 ifelse 创建 x 变量,但遇到了缺失值的问题。例如,使用以下表达式:

y <- ifelse(a==1 | b==1 | c==1, 1, ifelse(a==0 | b==0 | c==0, 0, NA))
df <- cbind(df, y)
df

...结果列在第 1 行和第 10 行错误地得到“NA”,即当存在 0 和 NA 的组合时,结果应该是 0,而不是 NA。

您可以使用 rowSums :

cols <- c('a', 'b', 'c')
+(rowSums(df[, cols], na.rm = TRUE) > 0) * NA^+(rowSums(!is.na(df[, cols])) == 0)
#[1]  0  1  1  0  1  1  1  0 NA  0

这给出了与 x 类似的结果,但是可能难以理解。


这是一个使用 apply 的简单替代方法:

apply(df[, cols], 1, function(x) if(all(is.na(x))) NA else +(any(x == 1, na.rm = TRUE)))
#[1]  0  1  1  0  1  1  1  0 NA  0

此 returns NA 如果行中的所有值都是 NA 否则检查 any 值是否包含 1。