У меня есть вложенный список, похожий на следующий манекен:

list1 <- list(1:3, 4:7, 8:10)
list2 <- list(2:5, 4:9, 19:23, 15:18)
list3 <- list(1:5)

nested_list <- list(list1, list2, list3)
names(nested_list) <- c("first", "second", "third")

Первый уровень назван, а второй - нет. Я хотел бы присвоить имена второму уровню списка на основе имен первого уровня и индексов pos, чтобы структура этого списка выглядела так:

List of 3
 $ first :List of 3
  ..$ first_1: int [1:3] 1 2 3
  ..$ first_2: int [1:4] 4 5 6 7
  ..$ first_3: int [1:3] 8 9 10
 $ second:List of 4
  ..$ second_1: int [1:4] 2 3 4 5
  ..$ second_2: int [1:6] 4 5 6 7 8 9
  ..$ second_3: int [1:5] 19 20 21 22 23
  ..$ second_4: int [1:4] 15 16 17 18
 $ third :List of 1
  ..$ third_1: int [1:5] 1 2 3 4 5

Кто-нибудь знает, как это решить? Буду признателен за помощь.

0
ramen 23 Ноя 2021 в 18:06

3 ответа

Лучший ответ

Как насчет петли for?

for (i in seq_along(nested_list)) {
   names(nested_list[[i]]) <- paste(names(nested_list)[i], 
                                    seq_along(nested_list[[i]]), 
                                    sep = "_")
}
1
Ben Bolker 23 Ноя 2021 в 18:20
Спасибо, мудрый.
 – 
ramen
23 Ноя 2021 в 18:24
Комментарии с благодарностью на самом деле устарели в SO, но вы можете нажать на галочку, чтобы принять ответ, если он решит вашу проблему.
 – 
Ben Bolker
23 Ноя 2021 в 18:26

Альтернативный вариант:

setNames(lapply(seq_along(nested_list), function(x) { setNames(nested_list[[x]],paste(names(nested_list)[x], 1:length(nested_list[[x]]), sep="_")) }), names(nested_list))
1
Quixotic22 23 Ноя 2021 в 18:37

Использование imap

library(purrr)
library(stringr)
nested_list <- imap(nested_list, ~ setNames(.x, str_c(.y, "_", seq_along(.x))))

-вывод

> str(nested_list)
List of 3
 $ first :List of 3
  ..$ first_1: int [1:3] 1 2 3
  ..$ first_2: int [1:4] 4 5 6 7
  ..$ first_3: int [1:3] 8 9 10
 $ second:List of 4
  ..$ second_1: int [1:4] 2 3 4 5
  ..$ second_2: int [1:6] 4 5 6 7 8 9
  ..$ second_3: int [1:5] 19 20 21 22 23
  ..$ second_4: int [1:4] 15 16 17 18
 $ third :List of 1
  ..$ third_1: int [1:5] 1 2 3 4 5
1
akrun 23 Ноя 2021 в 19:06