这似乎是一个基本问题,但我有以下列表和向量:
ll <- list(a=c(1,2,1,2,1,1,1),
b=c("a","v","h","j","w","h", "m"),
field=c("may","june","may","mars","july", "august", "september")
id=125887,
weather="sunny")
bool<-c(TRUE,TRUE,FALSE,FALSE,FALSE,TRUE,FALSE)
我的目标是:
ll <- list(a=c(1,2,1),
b=c("a","v","h"),
field=c("may","june","may","mars","july", "august", "september")
id=125887,
weather="sunny")
我可以通过以下方式完成:
ll$a <- ll$a[bool]
ll$b <- ll$b[bool]
对于很多修改,它很不方便。因此,创建函数的代码更有效:
f <- function(u){
ll[[u]] <- ll[[u]][bool]
}
鉴于向量vec<-c("a","b")
,我想做lapply(vec, f)
之类的事情,但这并没有直接给我结果.R不能通过引用工作但我想知道我是否可以更新我的列表直接!
答案 0 :(得分:0)
lapply
将列表中的每个项目分别传递给您提供的功能。因此,f
正在接收ll$a
作为u
。相反,你想要:
newll = lapply(ll, function(x) x[bool])
或者更安全一点
newll = lapply(ll, function(x) if(length(x)==length(bool)) x[bool] else x)
答案 1 :(得分:0)
lapply()
中嵌入了for()
循环,因此它不比真正循环更有效。通过更改函数外部的数据,而不是编写函数并打破函数编程范例,为什么不在顶层使用for循环呢?
for (i in 1:2){
ll[[i]] <- ll[[i]][bool]
}
或循环遍历整个列表,只改变长度合适的位置
for (i in seq_along(ll)){
if (length(ll[[i]])==length(bool)) ll[[i]] <- ll[[i]][bool]
}