根据逻辑语句对列表对象进行子集化
Subsetting a list object based on a logical statement
我正在尝试根据条件对一些向量进行子集化。分别对它们进行子集化会给我不同的行为(正确的行为),而不是 运行 包含它们的列表中的子集。这可能是我没有注意到的一件容易的事情。
单独子集化:
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]<-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
正如@RichardScriven 在评论中指出的那样,您需要 return x 在您的 lapply 函数中。当您编写函数时,return 值要么被显式指定(通过 return(...)
),要么被视为最后执行的语句。
如您所写,您的函数执行以下操作:
lapply(w, function(x) {
x <- x[x==5] # subsets a single element
return(x <- 0) # returns only a single element
}
相反,您希望仅更改容器(矢量)中的一个元素,然后 return 整个容器:
lapply(w, function(x) {
x[x==5] <- 0 # modify only a single element
return(x) # return the whole vector
}
我正在尝试根据条件对一些向量进行子集化。分别对它们进行子集化会给我不同的行为(正确的行为),而不是 运行 包含它们的列表中的子集。这可能是我没有注意到的一件容易的事情。
单独子集化:
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]<-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
正如@RichardScriven 在评论中指出的那样,您需要 return x 在您的 lapply 函数中。当您编写函数时,return 值要么被显式指定(通过 return(...)
),要么被视为最后执行的语句。
如您所写,您的函数执行以下操作:
lapply(w, function(x) {
x <- x[x==5] # subsets a single element
return(x <- 0) # returns only a single element
}
相反,您希望仅更改容器(矢量)中的一个元素,然后 return 整个容器:
lapply(w, function(x) {
x[x==5] <- 0 # modify only a single element
return(x) # return the whole vector
}