lapply不起作用

时间:2017-02-22 17:44:32

标签: r str-replace lapply

需要检查数据框中的列,并在值连续为TRUE(不连续为TRUE)时替换这些值。以下是一个例子。 lapply不起作用,b列根本没有变化。

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不起作用!感谢。

1 个答案:

答案 0 :(得分:2)

lapply中的函数与R中的任何其他函数一样,并且具有本地副本。在函数中所做的更改不会神奇地传播到调用者。

了解c如何改变:

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

在每个函数调用结束时打印c,每次只更改一个值。因为下次lapply它是一个新功能,带有新的上下文。

如果您希望使用lapply更改内容,则必须使用lapply中返回的值并对其执行操作。