【发布时间】:2020-07-24 13:43:04
【问题描述】:
我在 R 的嵌套列表结构中有数据,我想使用查找表来更改名称,无论它们在结构中的什么位置。 示例
# build up an example
x <- as.list(c("a" = NA))
x[[1]] <- vector("list", 4)
names(x[[1]]) <- c("b","c","d","e")
x$a$b <- vector("list", 2)
names(x$a$b) <- c("d","f")
x$a$c <- 3
x$a$d <- 27
x$a$e <- "d"
x$a$b$d <- "data"
x$a$b$f <- "more data"
# make a lookup table for names I want to change from; to
lkp <- data.frame(matrix(data = c("a","z","b","bee","d","dee"),
ncol = 2,
byrow = TRUE), stringsAsFactors = FALSE)
names(lkp) <- c("from","to")
上面的输出
> x
$a
$a$b
$a$b$d
[1] "data"
$a$b$f
[1] "more data"
$a$c
[1] 3
$a$d
[1] 27
$a$e
[1] "d"
> lkp
from to
1 a z
2 b bee
3 d dee
这是我想出的仅第一级:
> for(i in 1:nrow(lkp)){
+ names(x)[names(x) == lkp$from[[i]]] <- lkp$to[[i]]
+ }
> x
$z
$z$b
$z$b$d
[1] "data"
$z$b$f
[1] "more data"
$z$c
[1] 3
$z$d
[1] 27
$z$e
[1] "d"
这样可以正常工作,但使用循环并且只能到达第一级。我尝试了各种版本的 *apply 世界,但还没有得到有用的东西。
提前感谢您的任何想法
编辑: 有趣的是 rapply 在尝试访问和修改名称时惨败(或者,我的尝试惨败!)。这是一个尝试将所有名称更改为相同的示例
> namef <- function(x) names(x) <- "z"
> rapply(x, namef, how = "list")
$a
$a$b
$a$b$d
[1] "z"
$a$b$f
[1] "z"
$a$c
[1] "z"
$a$d
[1] "z"
$a$e
[1] "z"
【问题讨论】:
-
请问你最后需要什么?你真的需要这样的嵌套列表吗?
-
@Roman,感谢您的提问。是的,我正在导出到 XML,所以我需要维护嵌套结构。大图:我正在将长名称更改为与 xml 标签匹配的短名称。我可以最初只用短名称构建嵌套列表,但我已经用长名称走了这么远,我希望有一种简单的方法来做到这一点。