我正在尝试评估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
但它对我来说无效。
答案 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