Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 不使用循环修改子列表中的特定元素_R_Lapply - Fatal编程技术网

R 不使用循环修改子列表中的特定元素

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

我有一个列表,我正试图以特定的方式修改它。列表列表的组织方式类似于矩阵,但每个元素都是一个数值向量。我的目标是根据这些向量的位置只更新其中的一小部分。例如,更新某些子列表中的第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(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
#......