2014-05-23 1 views
1

data.frame의 단일 (논리적) 열을 평가하려고 시도하고 있으며 FALSE가있는 곳이면 TRUE로 변환하지만 10 %의 확률로 변환합니다. 내가 필요로하는 기능을논리를 테스트하고 FALSE가 10 % 확률로 TRUE로 변경하면

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은 안양 $ D1의 각 요소를 평가에 도착하고 거짓을 발견 한 경우, 10 %의 확률로 TRUE로 변환 할 것으로 예를 들면? 참고로 나이가 들어감에 따라 질병이 시작됩니다. 질병 X가있는 사람은 이미 T (T → T)를 유지하지만, 매년 X가 발병 할 확률은 10 %입니다 (F → T (P = 0.1)). 그것을 가지고.

나는

!df$D1 

으로 시도했지만 나를 위해 제대로 작동하지 않습니다.

답변

4

다음은 해결책입니다. 먼저 FALSE에 해당하는 모든 행 번호를 D1에 입력합니다.

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

여기에 1 개의 행이 있습니다.

그런 다음 각 행을 무작위로 생성 된 논리 값으로 대체합니다. TRUE은 확률 0.1 ​​및 FALSE0.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