递归地更改R中嵌套列表中的名称

标签 r list names

我在 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"

最佳答案

我使用了 character 向量来代替 data.frame 进行查找,但如果您确实想要一个数据,则可以很容易地更改它.frame.

lkp2 <- lkp$to
names(lkp2) <- lkp$from

rename <- function(nested_list) {
    found <- names(nested_list) %in% names(lkp2)
    names(nested_list)[found] <- lkp2[names(nested_list)[found]]
    nested_list %>% map(~{
        if (is.list(.x)) {
            rename(.x)
        } else {
            .x
        }
    })
}
rename(x)
# $z
# $z$bee
# $z$bee$dee
# [1] "data"
#
# $z$bee$f
# [1] "more data"
#
#
# $z$c
# [1] 3
#
# $z$dee
# [1] 27
#
# $z$e
# [1] "d"

我不确定这是否是最好的方法,但它似乎可以完成这项工作,并且如果您只处理小型列表(如 XML 文档),则无需太担心性能。

您可能想用一个更好的名称来命名该函数。

关于递归地更改R中嵌套列表中的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63074814/

相关文章:

r - 如何按列最好地规范化 R 中的数据框?

.net - 何时使用Collection <T> vs List <T>

VHDL 2008 : Index in external names containing generated instances

c++ - 使用 const 类型标记变量

python - 不断检查列表并在列表中有项目时执行某些操作

java - 在 Java 中使用循环创建变量名?

r - 如何使用 lapply 在 R 的列表中找到最接近的值?

r - 变量选择方法

r - 合并的 xts 对象未对齐

list - 将标记数组添加到Flutter_Map仅在移动 map 后显示