在R中的列表中替换列表

Replacing in list inside list in R

我有如下列表:

x <- list(x = list(a = 1:10, b = 10:20), y = 4, z = list(a = 1, b = 2))

str(x)

List of 3
 $ x:List of 2
  ..$ a: int [1:10] 1 2 3 4 5 6 7 8 9 10
  ..$ b: int [1:11] 10 11 12 13 14 15 16 17 18 19 ...
 $ y: num 4
 $ z:List of 2
  ..$ a: num 1
  ..$ b: num 2

如何替换列表“x”(x$a) 中的列表“a”中的值,例如将 1 替换为 100。

我的真实数据非常大,无法一一进行,unlist功能对我来说也不是解决方案,因为我遗漏了信息。

有什么想法吗??

对所有子组件进行操作

对于问题中显示的列表 x,我们可以检查每个组件是否是具有 a 组件的列表,如果是,则将 a 组件中的 1 替换为 100。

f <- function(z) { if (is.list(z) && "a" %in% names(z)) z$a[z$a == 1] <- 100; z }
lapply(x, f)

只是 x 分量

1)如果只想对x的x分量进行替换,那么x2就是结果。

x2 <- x
x2$x$a[x2$x$a == 1] <- 100

2) 仅对 x 组件进行操作的另一种可能性是使用 rrapply。

library(rrapply)

cond <- function(z, .xparents) identical(.xparents, c("x", "a"))
rrapply(x, cond, function(z) replace(z, z == 1, 100))

3) 另一种可能性是使用 modifyList

modifyList(x, list(x = list(a = replace(x$x$a, x$x$a ==1, 100))))

4)里面还有一个选项。

within(x, x$a[x$a == 1] <- 100 )

4a) 或迭代:

within(x, x <- within(x, a[a == 1] <- 100) )

这是使用 relist + unlist

的技巧
> v <- unlist(x)

> relist(replace(v, grepl("\.a\d?", names(v)) & v == 1, 100), x)
$x
$x$a
 [1] 100   2   3   4   5   6   7   8   9  10

$x$b
 [1] 10 11 12 13 14 15 16 17 18 19 20


$y
[1] 4

$z
$z$a
[1] 100

$z$b
[1] 2