【问题标题】:Subsetting a list object based on a logical statement基于逻辑语句对列表对象进行子集化
【发布时间】:2015-12-02 17:15:52
【问题描述】:

我正在尝试根据条件对一些向量进行子集化。单独对它们进行子集化给了我不同的行为(正确的行为),而不是在包含它们的列表上运行子集。这可能是一件我没有注意到的简单事情。

单独子集:

a<-1:10
b<-11:20
a[a==5]<-0
a

这给了:

> a
 [1]  1  2  3  4  0  6  7  8  9 10

使用lapply 和与函数相同的子集技术(即x[x==5]&lt;-0)在列表中进行子集:

a<-1:10
b<-11:20
w<-list(a,b)
q<-lapply(w, function(x){x[x==5]<-0})
q

这给了:

> q
[[1]]
[1] 0

[[2]]
[1] 0

【问题讨论】:

  • 你需要从函数q &lt;- lapply(w, function(x) { x[x == 5] &lt;- 0; x })返回x
  • @RichardScriven 效果很好。

标签: r lapply


【解决方案1】:

正如@RichardScriven 在 cmets 中指出的那样,您需要在 lapply 函数中返回 x。编写函数时,返回值要么明确指定(通过return(...)),要么被视为最后执行的语句。

正如您所写,您的函数执行以下操作:

lapply(w, function(x) {
  x <- x[x==5] # subsets a single element
  return(x <- 0) # returns only a single element
}

相反,您希望只更改容器中的一个元素(向量),然后返回整个容器:

lapply(w, function(x) {
  x[x==5] <- 0 # modify only a single element
  return(x) # return the whole vector
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    相关资源
    最近更新 更多