首页 > 解决方案 > 如何动态命名列表的元素?

问题描述

我想用变量的内容动态命名列表的元素,我该怎么做?

DT <- data.table(A=LETTERS[1:3], B=letters[1:3], C= 1:9)

lapply(unique(DT$A), function(xA){
  RTN <- 
    lapply(unique(DT$B), function(xB){
        output <- DT[A == xA & B == xB]$C
         if(length(output)== 0L) {
         }else{
           c(xA, xB, output)
         }
    }) 
})

结果是

[[1]]
[[1]][[1]]
[1] "A" "a" "1" "4" "7"
[[1]][[2]]
NULL
[[1]][[3]]
NULL
[[2]]
[[2]][[1]]
NULL
[[2]][[2]]
[1] "B" "b" "2" "5" "8"
[[2]][[3]]
NULL

我想做如下

[[A]]
[[A]][[a]]
[1] "A" "a" "1" "4" "7"
[[A]][[b]]
NULL
[[A]][[c]]
NULL
[[B]]
[[B]][[a]]
NULL
[[B]][[B]]
[1] "B" "b" "2" "5" "8"
[[B]][[c]]
NULL

此外,我怎样才能删除 NULL,并使其成为一个完整的案例矩阵?非常感谢。

标签: r

解决方案


这里有两个解决方案:

1) 使用 sapply 并设置USE.NAMES = TRUE

2)在每个 lapply 之前捕获名称并在之后设置它们。

DT <- data.table(A=LETTERS[1:3], B=letters[1:3], C= 1:9)

outer_list_names <- unique(DT$A)
outer_list  <- lapply(unique(DT$A), function(xA){
  RTN_names = unique(DT$B)
  RTN <- 
    lapply(unique(DT$B), function(xB){
        output <- DT[A == xA & B == xB]$C
         if(length(output)== 0L) {
         }else{
           c(xA, xB, output)
         }
    })
  names(RTN) <- RTN_names 
})
names(outer_list) <- outer_list_names
outer_list

推荐阅读