2017-02-22 34 views
0

Нужно проверить столбец в фрейме данных и заменить значения, если они постоянно TRUE (не постоянно 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

В качестве альтернативы вы можете использовать 'c $ 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