Подтвердить что ты не робот

Как извлечь элементы из списка со смешанными элементами

У меня есть список в R со следующими элементами:

[[812]]
[1] ""             "668"          "12345_s_at" "667"          "4.899777748" 
[6] "49.53333333"  "10.10930207"  "1.598228663"  "5.087437057" 

[[813]]
[1] ""            "376"         "6789_at"  "375"         "4.899655078"
[6] "136.3333333" "27.82508792" "2.20223398"  "5.087437057"

[[814]]
[1] ""             "19265"        "12351_s_at" "19264"        "4.897730912" 
[6] "889.3666667"  "181.5874908"  "1.846451572"  "5.087437057" 

Я знаю, что могу получить к ним доступ с чем-то вроде list_elem[[814]][3] в случае, если я хочу извлечь третий элемент позиции 814. Мне нужно извлечь третий элемент всего списка, например 12345_s_at, и я хочу поместить их в вектор или список, чтобы позже можно было сравнить их элементы с другим списком. Ниже мой код:

elem<-(c(listdata))
lp<-length(elem)
for (i in 1:lp)
{
    newlist<-c(listdata[[i]][3]) ###maybe to put in a vector
    print(newlist)
 }

Когда я печатаю результаты, я получаю третий элемент, но вот так:

  [1] "1417365_a_at"
  [1] "1416336_s_at"
  [1] "1416044_at"
  [1] "1451201_s_at"

поэтому я не могу пересечь их с индексом, подобным newlist[3], потому что он возвращает NA. Где моя ошибка?

4b9b3361

Ответ 1

Если вы хотите извлечь третий элемент из каждого элемента списка, вы можете сделать:

List <- list(c(1:3), c(4:6), c(7:9))
lapply(List, '[[', 3)  # This returns a list with only the third element
unlist(lapply(List, '[[', 3)) # This returns a vector with the third element

Используя ваш пример и принимая во внимание комментарий @GSee, вы можете:

yourList <- list(c("","668","12345_s_at","667", "4.899777748","49.53333333",
       "10.10930207", "1.598228663","5.087437057"),
     c("","376", "6789_at",  "375",  "4.899655078","136.3333333",
       "27.82508792", "2.20223398",  "5.087437057"),
     c("", "19265", "12351_s_at", "19264", "4.897730912",
       "889.3666667", "181.5874908","1.846451572","5.087437057" ))

sapply(yourList, '[[', 3)
[1] "12345_s_at" "6789_at"    "12351_s_at"

В следующий раз вы можете предоставить некоторые данные, используя dput на части вашего набора данных, чтобы мы могли легко воспроизвести вашу проблему.

Ответ 2

С помощью purrr вы можете извлекать элементы и обеспечивать согласованность типов данных:

library(purrr)

listdata <- list(c("","668","12345_s_at","667", "4.899777748","49.53333333",
       "10.10930207", "1.598228663","5.087437057"),
     c("","376", "6789_at",  "375",  "4.899655078","136.3333333",
       "27.82508792", "2.20223398",  "5.087437057"),
     c("", "19265", "12351_s_at", "19264", "4.897730912",
       "889.3666667", "181.5874908","1.846451572","5.087437057" ))

map_chr(listdata, 3)
## [1] "12345_s_at" "6789_at"    "12351_s_at"

Существуют и другие функции map_, которые также обеспечивают согласованность типов и map_df(), которые могут, наконец, помочь завершить безумие do.call(rbind, …).

Ответ 3

Если вы хотите использовать код, введенный в свой вопрос, ниже приведено исправление:

listdata <- list(c("","668","12345_s_at","667", "4.899777748","49.53333333",
       "10.10930207", "1.598228663","5.087437057"),
     c("","376", "6789_at",  "375",  "4.899655078","136.3333333",
       "27.82508792", "2.20223398",  "5.087437057"),
     c("", "19265", "12351_s_at", "19264", "4.897730912",
       "889.3666667", "181.5874908","1.846451572","5.087437057" ))

v <- character() #creates empty character vector
list_len <- length(listdata)
for(i in 1:list_len)
    v <- c(v, listdata[[i]][3]) #fills the vector with list elements (not efficient, but works fine)

print(v)
[1] "12345_s_at" "6789_at"    "12351_s_at"