【问题标题】:lapply does not worklapply 不工作
【发布时间】:2017-02-22 17:44:31
【问题描述】:

需要检查数据框中的列并替换值是否连续为真(不是连续为真)。下面是一个例子。 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 不起作用!谢谢。

【问题讨论】:

  • 或者,您可以使用c$b[c$b &amp; c(1, diff(c$b)) == 0] &lt;- FALSE 例如
  • 谢谢,更简单了!

标签: r str-replace lapply


【解决方案1】:

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

看看c在这方面的变化:

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

在每个函数调用结束时,它会打印c,并且每次只有一个值发生变化。因为下次在 lapply 中,它是一个新函数,具有新的上下文。

如果你想用lapply 改变事情,你必须利用lapply 的返回值并用它做一些事情。

【讨论】:

    猜你喜欢
    • 2016-06-24
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多