2017-02-22 9 views
0

데이터 프레임의 열을 검사하고 값이 TRUE (연속적이 아님) 인 경우 값을 대체해야합니다. 아래는 그 예입니다. lapply가 작동하지 않습니다. b 열은 전혀 변경되지 않습니다.lapply가 작동하지 않음

a<- c(1,2,3,4,5,1,1,1) 
b<- c(TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,TRUE) 
c<- data.frame(a,b) 

index<- which(c$b == TRUE) 
lapply(index,function(ind){ 
    c$b[ind + 1]<- ifelse(c$b[ind + 1]==TRUE,FALSE,FALSE) 
}) 

또 다른 방법이 있으며 효과가 있습니다.

trues <- which(c$b) 
c$b[c$b == TRUE][c(0, trues[2:length(trues)] - trues[1:length(trues)-1]) == 1] <- FALSE 

The correct result is: 
> c 
    a  b 
1 1 TRUE 
2 2 FALSE 
3 3 FALSE 
4 4 FALSE 
5 5 TRUE 
6 1 FALSE 
7 1 FALSE 
8 1 TRUE 

여전히 lapply가 작동하지 않는 이유를 알고 싶습니다. 감사.

+0

다른 방법으로는'$ b [c $ b & c (1, diff (c $ b)) == 0] <- FALSE' 예를 들어 –

+0

감사합니다. – user1047

답변

2

lapply의 기능은 R의 다른 기능과 동일하게 작동하며 사물의 로컬 복사본이 있습니다. 함수에서 변경 한 내용은 호출자에게 마술처럼 전파되지 않습니다.

이의 c 변경하는 방법을 봐 :

lapply(index, function(ind){c$a[ind]=99;print(c)}) 

각 기능의 끝이 호출은 c을 인쇄, 단 하나의 값은 각 시간이 변경되었습니다. 다음 번에 lapply에 새 컨텍스트가있어서 새로운 기능이기 때문입니다.

lapply으로 변경하려는 경우 lapply의 반환 값을 사용해야하고 그 값으로 무언가를해야합니다.

+0

답해 주셔서 감사합니다. 이제 나는 무슨 일이 일어 났는지 압니다. – user1047