как назвать элементы списка на лету? - PullRequest
0 голосов
/ 21 января 2019

Я хотел бы назвать элементы списка на лету с содержимым переменной, как мне поступить?

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

Iхотел бы сделать это следующим образом

[[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 и сделать его полной матрицей дел?Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Мы могли бы создать именованный вектор для именования списка

A_vec <- setNames(unique(DT$A), unique(DT$A))
B_vec <- setNames(unique(DT$B), unique(DT$B))

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


#$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, у нас может быть Filter для их удаления

lapply(A_vec, function(xA){
     RTN <- lapply(B_vec, function(xB){
     output <- DT[A == xA & B == xB]$C
     if(length(output) >  0L) {
        c(xA, xB, output)
     }
   })
   Filter(Negate(is.null), RTN)
})


#$A
#$A$a
#[1] "A" "a" "1" "4" "7"


#$B
#$B$b
#[1] "B" "b" "2" "5" "8"


#$C
#$C$c
#[1] "C" "c" "3" "6" "9"
0 голосов
/ 21 января 2019

Вот два решения:

1) Используйте sapply и установите USE.NAMES = TRUE

2) Захватывайте имена перед каждой помпой и устанавливайте их после.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...