在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
我有如下列表:
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