Как вывести указанные c элементы из списка и вернуть вектор - PullRequest
1 голос
/ 10 апреля 2020

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

mylist <- list(list(list()), 
    list(list()), list(list()), list(list()),
    list(structure(list(source = c("IDcode", "IDcode", "IDcode"
    ), db_id = c("id13653662", "id3396732", "id995182")), class = "data.frame", row.names = c(NA, 
    3L))), list(structure(list(source = c("IDcode", "IDcode"
    ), db_id = c("id1494969", "id869437")), class = "data.frame", row.names = 1:2)), 
    list(structure(list(source = c("IDcode", "IDcode"), db_id = c("id578674", 
    "id531006")), class = "data.frame", row.names = 1:2)), list(
        structure(list(source = c("IDcode", "IDcode"), db_id = c("id578673", 
        "id531005")), class = "data.frame", row.names = 1:2)))



> mylist
[[1]]
[[1]][[1]]
list()


[[2]]
[[2]][[1]]
list()


[[3]]
[[3]][[1]]
list()


[[4]]
[[4]][[1]]
list()


[[5]]
[[5]][[1]]
  source      db_id
1 IDcode id13653662
2 IDcode  id3396732
3 IDcode   id995182


[[6]]
[[6]][[1]]
  source     db_id
1 IDcode id1494969
2 IDcode  id869437


[[7]]
[[7]][[1]]
  source    db_id
1 IDcode id578674
2 IDcode id531006


[[8]]
[[8]][[1]]
  source    db_id
1 IDcode id578673
2 IDcode id531005

Я хочу преобразовать его в вектор, который будет храниться в виде столбца в кадре данных. В идеале вектор должен иметь NA, где есть пустой список (например, от [[1]] до [[4]]), и если список заполнен, он просто вводит коды идентификаторов, разделенные ;, например: id13653662; id3396732; id995182.

Другими словами, я хотел бы, чтобы результирующий вектор выглядел так:

> mylist 
 [1] NA                    NA                                     NA     
 [4] NA                    "id13653662; id3396732; id995182"      "id1494969; id869437"     
 [7] "id578674; id531006"  "id578673;id531005"

Каков наилучший способ сделать это?

Ответы [ 3 ]

2 голосов
/ 10 апреля 2020

Поскольку у нас есть список внутри каждого списка, мы unlist получаем один уровень и возвращаем вставленный вывод или NA на основе длины каждого списка.

sapply(unlist(mylist, recursive = FALSE), function(x) 
       if(length(x)) paste0(x$db_id, collapse = ";") else NA)

#[1] NA                NA                              NA                     
#[4] NA       "id13653662;id3396732;id995182" "id1494969;id869437"         
#[7] "id578674;id531006"         "id578673;id531005"
1 голос
/ 10 апреля 2020
vec <- vector()

for (i in 1:length(mylist)) {
  for (j in 1:length(mylist[[i]])) {
       if(length(mylist[[i]][[j]]) == 0){
          vec[i] <- NA
       }
       else{      
         vec[i] <- paste0(mylist[[i]][[j]]$db_id,collapse = ";")
       }
   }
}
0 голосов
/ 10 апреля 2020

Вы имеете в виду что-то вроде

rbind(mylist[[5]][[1]],mylist[[6]][[1]], mylist[[7]][[1]], mylist[[8]][[1]])
 source      db_id
1 IDcode id13653662
2 IDcode  id3396732
3 IDcode   id995182
4 IDcode  id1494969
5 IDcode   id869437
6 IDcode   id578674
7 IDcode   id531006
8 IDcode   id578673
9 IDcode   id531005

ИЛИ

mySecFun <- function(mylist)
{
  vec <- vector()

  for (i in 1:length(mylist)) {
    for (j in 1:length(mylist[[i]])) {
      if(length(mylist[[i]][[j]]) == 0){
        vec[i] <- NA
      }
      else{      
        vec[i] <- paste0(mylist[[i]][[j]]$db_id,collapse = ";")
      }
    }
  }
  vec
}

mySecFun(mylist)

И вы можете применить то же самое для других списков (mylist1,mylist2,...) как

 mySecFun(mylist1); mySecFun(mylist2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...