Как назначить атрибуты списка в качестве имен списков в R

У меня есть список (414 элементов), который содержит другие списки разной длины (от 0 до 9). Каждый из этих подсписков имеет разное количество строк и столбцов.

Некоторые из подсписков имеют длину 1, как показано ниже, и имеют только 1 атрибут:

tables_list[[1]]
     [,1]                         [,2]                
[1,] "ID Number"                  "ABCD"              
[2,] "Code"                       "1239463"             
[3,] "Version"                    "1"                 
[4,] "Name"                       "ABC"
[5,] "Status"                     "Open"         
[6,] "Currency"                   "USD"               
[7,] "Average"                    "No"                
[8,] "FX Rate"                    "2.47"    

attr(,"caption")
[1] "5 && Introduction && NA"

Другие подсписки имеют длину 2 или больше и имеют 1 или более атрибутов, как показано ниже:

tables_list[[17]]
[[1]]
      [,1]  [,2]                                                  [,3]  [,4]              [,5]            [,6]              [,7]          [,8] [,9]            
 [1,] ""    ""                                                    "USD" "Balance"         "Movement in"   "Aggregate"       "Overall"     ""   "Overall"       
 [2,] ""    ""                                                    ""    "brought forward" "year"          "annual"          "aggregate"   ""   "funded account"
 [3,] ""    ""                                                    ""    "from previous"   ""              "information"    "adjustments"  ""   ""              
 [4,] ""    ""                                                    ""    "year end"        ""              ""                ""            ""   ""              
 [5,] ""    ""                                                    ""    "1"               "2"             "3"               "4"           ""   "5"             
 [6,] "12"  "Value 1"                                             ""    "0"               "3,275,020"     "3,275,020"       ""            "0"  "3,275,020"     
 [7,] "13"  "Value 2"                                             ""    "0"               "0"             "0"               ""            "0"  "0"             
 [8,] "14"  "Value 3"                                             ""    "0"               "8,267,862"     "8,267,862"       ""            "0"  "8,267,862"     
 [9,] "15"  "Value 4"                                             ""    "0"               "(590,073,321)" "(590,073,321)"   ""            "0"  "(590,073,321)" 
[10,] "16"  "Value 5"                                             ""    "0"               "0"             "0"               ""            "0"  "0"             
[11,] "17"  "Value 6"                                             ""    "0"               "0"             "0"               ""            "0"  "0"             
[12,] "18"  "Value 7"                                             ""    "0"               "0"             "0"               ""            "0"  "0"             
[13,] "19"  "Value 8"                                             ""    "0"               "0"             "0"               ""            "0"  "0"             
[14,] "20"  "Value 9"                                             ""    "0"               "(459,222,782)" "(459,222,782)"   ""            "0"  "(459,222,782)" 

[[2]]
     [,1]               [,2]   [,3]                                                                  [,4]           
[1,] "Theme"            "Year" "Comment"                                                             "Created"      
[2,] "Line 17 Column 2" "N/A"  "Amounts are calculated according to recent standards"                "XXXXXXXXXXXX"
[3,] ""                 ""     "paid by XXXXXXXXXXXXX"                                               ""      
attr(,"caption")
[1] "20 && Values for year 2017 && NA"
[2] "20 && Comments for 2017 && NA"

Это мой код для присвоения атрибута каждому list в tables_list.

tables_list <- lapply(tables$page, function(p) {
    cat(p, "\n")
    out <- extract_tables(Path, 
                          pages = p,
                          encoding = "UTF-8", 
                          method = "stream", 
                          output = "matrix")
    #This part of the code points out the title, page of each table and reporting year if applicable so we can keep track of what goes where
    attr(out, "caption") <- paste(as.character(tables$page[tables$page %in% p]), tables$text[tables$page %in% p], tables$Reportingyear[tables$page %in% p], sep = " && ")
    return(out)
  })

Я не могу найти способ назначить эти атрибуты именами соответствующих списков. У кого-нибудь есть идеи, как к этому подойти?


person A.N.    schedule 30.05.2019    source источник


Ответы (1)


Если я правильно понимаю, следующее присваивает значения атрибута "caption" каждому из подсписков.

tables_list <- lapply(tables_list, function(L){
  names(L) <- sapply(L, attr, "caption")
  L
})

tables_list[[2]]$V
#     [,1] [,2]
#[1,]    1    6
#[2,]    2    7
#[3,]    3    8
#[4,]    4    9
#[5,]    5   10
#attr(,"caption")
#[1] "V"

Код создания примера данных.

Это создает список списков, каждый из которых содержит матрицы в качестве элементов. Матрицы имеют атрибут "caption", установленный на заглавную букву.

tables_list <- list(
  list(matrix(1:6, nrow = 3)),
  list(matrix(1:8, nrow = 4), matrix(1:10, nrow = 5)),
  list(matrix(1:4, nrow = 2), matrix(1:18, nrow = 9), matrix(4:1, nrow = 4))
)


set.seed(1234)
tables_list <- lapply(tables_list, function(L){
  lapply(L, function(M) {
    attr(M, "caption") <- sample(LETTERS, 1)
    M
  })
})
person Rui Barradas    schedule 30.05.2019
comment
Я попытался применить ваш пример кода к своему коду, однако, когда дело доходит до списка, такого как tables_list[[17]] в моем примере, я получаю следующую ошибку: Error in names(L) <- sapply(L, attr, "caption") : 'names' attribute [2] must be the same length as the vector [1] - person A.N.; 30.05.2019
comment
Можете ли вы опубликовать вывод dput(tables_list[16:18])? Или, если он слишком длинный, просто dput(tables_list[17]). (Только один [ и ].) - person Rui Barradas; 30.05.2019
comment
Кроме того, сообщение об ошибке, вероятно, означает, что у некоторых членов tables_list[[17]] не установлен атрибут заголовка. - person Rui Barradas; 30.05.2019