我有一份记录清单:
z <- list(list(a=1),list(a=4),list(a=2))
我尝试为每个字段添加字段。 唉,不是
lapply(z,function(l) l$b <- 1+l$a)
,也不
for(l in z) l$b <- 1+l$a
修改z
。
在这个简单的例子中,我当然可以做到
z <- lapply(z,function(l) c(list(b= 1+l$a),l))
但是当列表有更多嵌套时,这很快就会失控:
z <- list(list(a=list(b=1)),list(a=list(b=4)),list(a=list(b=2)))
如何将其变为
list(list(a=list(b=1,c=2)),list(a=list(b=4,c=5)),list(a=list(b=2,c=3)))
不重复整个结构的定义?
z
的每个元素都有很多字段,而不仅仅是a
; z[[10]]$a
有许多子字段,而不只是b
。
答案 0 :(得分:4)
您的第一个代码示例不会修改列表,因为您需要在调用lapply
时返回列表:
z <- list(list(a=1),list(a=4),list(a=2))
expected <- list(list(a=1, b=2), list(a=4, b=5), list(a=2, b=3))
outcome <- lapply(z,function(l) {l$b <- 1+l$a ; l})
all.equal(expected, outcome)
# [1] TRUE
在双重嵌套示例中,您可以在lapply
中使用lapply
,再次确保返回内部lapply
中的列表:
z <- list(list(a=list(b=1)),list(a=list(b=4)),list(a=list(b=2)))
expected <- list(list(a=list(b=1, c=2)), list(a=list(b=4, c=5)), list(a=list(b=2, c=3)))
obtained <- lapply(z, function(l1) { lapply(l1, function(l2) {l2$c = l2$b+1 ; l2 } )})
all.equal(expected, obtained)
# [1] TRUE
答案 1 :(得分:2)
另一个有点令人费解的选择:
z <- list(list(a=1),list(a=4),list(a=2))
res <- list(list(a=list(b=1,c=2)),list(a=list(b=4,c=5)),list(a=list(b=2,c=3)))
res1 <- rapply(z,function(x) list(b = x,c = x+1),how = "replace")
> all.equal(res,res1)
[1] TRUE
我只是说复杂因为rapply
有时候很难使用(至少对我来说)。