R 不使用循环修改子列表中的特定元素
我有一个列表,我正试图以特定的方式修改它。列表列表的组织方式类似于矩阵,但每个元素都是一个数值向量。我的目标是根据这些向量的位置只更新其中的一小部分。例如,更新某些子列表中的第4个元素。这是我正在寻找的一个例子。为了简单起见,我遗漏了很多元素R 不使用循环修改子列表中的特定元素,r,lapply,R,Lapply,我有一个列表,我正试图以特定的方式修改它。列表列表的组织方式类似于矩阵,但每个元素都是一个数值向量。我的目标是根据这些向量的位置只更新其中的一小部分。例如,更新某些子列表中的第4个元素。这是我正在寻找的一个例子。为了简单起见,我遗漏了很多元素 foo <- list(list(NA, NA, NA, c(2)), list(NA, NA, NA, c(1, 5, 9)), list(NA, NA, NA, c(1, 5, 9)), list
foo <- list(list(NA, NA, NA, c(2)),
list(NA, NA, NA, c(1, 5, 9)),
list(NA, NA, NA, c(1, 5, 9)),
list(NA, NA, NA, c(7)),
list(NA, NA, NA, c(5, 8, 9)),
list(NA, NA, NA, c(1, 8, 9)))
这很好,但我还没有找到一个好方法将这些更新的向量放回列表中,以便得到下面的结果。我知道我可以用循环来实现,但我希望避免它们,因为这个过程会重复很多次,我认为有更好的方法来实现这一点
> foo
[[1]]
[[1]][[1]]
[1] NA
[[1]][[2]]
[1] NA
[[1]][[3]]
[1] NA
[[1]][[4]]
[1] 2
[[2]]
[[2]][[1]]
[1] NA
[[2]][[2]]
[1] NA
[[2]][[3]]
[1] NA
[[2]][[4]]
[1] 1 5 9
[[3]]
[[3]][[1]]
[1] NA
[[3]][[2]]
[1] NA
[[3]][[3]]
[1] NA
[[3]][[4]]
[1] 1 5 9
[[4]]
[[4]][[1]]
[1] NA
[[4]][[2]]
[1] NA
[[4]][[3]]
[1] NA
[[4]][[4]]
[1] 7
[[5]]
[[5]][[1]]
[1] NA
[[5]][[2]]
[1] NA
[[5]][[3]]
[1] NA
[[5]][[4]]
[1] 5 8
[[6]]
[[6]][[1]]
[1] NA
[[6]][[2]]
[1] NA
[[6]][[3]]
[1] NA
[[6]][[4]]
[1] 1 8
你可以这样做
foo[4:6] <- lapply(foo[4:6], function(x) c(x[1:3], list(x[[4]][!(x[[4]] %in% 9)])))
foo[4:6]
#[[1]]
#[[1]][[1]]
#[1] NA
#[[1]][[2]]
#[1] NA
#[[1]][[3]]
#[1] NA
#[[1]][[4]]
#[1] 7
#[[2]]
#[[2]][[1]]
#[1] NA
#[[2]][[2]]
#[1] NA
#[[2]][[3]]
#[1] NA
#[[2]][[4]]
#[1] 5 8
#......
我们仅在4:6列表中更改值,按原样合并1:3子列表,并从第4个列表中筛选值。Ahh,很好。是的,这会满足我的需要。现在看来很明显,我看到了。谢谢
foo[4:6] <- lapply(foo[4:6], function(x) c(x[1:3], list(x[[4]][!(x[[4]] %in% 9)])))
foo[4:6]
#[[1]]
#[[1]][[1]]
#[1] NA
#[[1]][[2]]
#[1] NA
#[[1]][[3]]
#[1] NA
#[[1]][[4]]
#[1] 7
#[[2]]
#[[2]][[1]]
#[1] NA
#[[2]][[2]]
#[1] NA
#[[2]][[3]]
#[1] NA
#[[2]][[4]]
#[1] 5 8
#......