测试逻辑,如果FALSE改变为TRUE,概率为10%

时间:2014-05-23 15:42:48

标签: r logical-operators

我正在尝试评估data.frame中的单个(逻辑)列,只要有FALSE,将其转换为TRUE但概率为10%。我认为我需要的功能是

as.logical(rbinom(1, 1, 0.1))

我会尝试使用lapply将它应用于列,但我无法获得布尔值的语法。例如,使用以下df

df <- data.frame (NM =c("N1", "N2", "N3", NA),
                  D1 = c(TRUE,FALSE,TRUE,NA),
                  D2 = c(100L,130L,140L,NA),
                  D3 = c(0.5, 1, 0, NA),
                  D4 = c(20, 24, 28, NA),
                  D5 = c(FALSE, FALSE, FALSE, NA)
                  )

我如何得到R来评估df $ D1的每个元素,当它找到一个FALSE时,将其转换为TRUE,概率为10%?仅供参考,这与疾病的发病有关。如果一个人已患有疾病X,那么他们将继续患有疾病(T - > T),然而每年他们有10%的机会发展X(F - > T(P = 0.1))如果他们不'已经拥有它。

我尝试过

!df$D1

但它对我来说无效。

1 个答案:

答案 0 :(得分:4)

这是一个解决方案。首先,我们在FALSE中获得与D1对应的所有行号。

(index <- which(!is.na(df$D1) & !df$D1))
## [1] 2

这里有一排这样的一行。

然后我们用随机生成的逻辑值替换每一行。 TRUE的概率为0.1,FALSE的概率为0.9

df$D1[index] <- sample(c(TRUE, FALSE), length(index),
                       replace=TRUE, prob=c(0.1, 0.9))

BTW,代码是矢量化的:我们立即将此过程应用于所有FALSE。这可以通过以下方式说明:

x <- c(TRUE, rep(FALSE, 20), NA) # an exemplary vector
(index <- which(!is.na(x) & !x))
##  [1]  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21
x[index] <- sample(c(TRUE, FALSE), length(index),
                   replace=TRUE, prob=c(0.1, 0.9))
x
## [1]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [18] FALSE  TRUE FALSE FALSE    NA