是否可以修改列表元素?

时间:2014-02-12 21:37:47

标签: r list

我有一份记录清单:

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

2 个答案:

答案 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有时候很难使用(至少对我来说)。