Как извлечь значения из этого списка (из rgbif) и преобразовать его во фрейм данных в R? - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть этот список l

l

    $`5216014`
    $`5216014`[[1]]
                name     key    rank
    1       Animalia       1 kingdom
    2       Chordata      44  phylum
    3 Elasmobranchii     121   class
    4     Rajiformes     884   order
    5        Rajidae    5877  family
    6           Raja 2342057   genus
    7  Raja montagui 5216014 species


    $`5216208`
    $`5216208`[[1]]
                   name     key    rank
    1          Animalia       1 kingdom
    2          Chordata      44  phylum
    3    Elasmobranchii     121   class
    4        Rajiformes     884   order
    5           Rajidae    5877  family
    6         Amblyraja 2420436   genus
    7 Amblyraja radiata 2420446 species

Я хотел бы извлечь только row число 7 для столбцов name и key и создать базу данных, подобную этой:

df

name                key
Raja montagui       5216014
Amblyraja radiata   2420446

Я пробовал с lapply функцией:

lapply(l,function(x) x[7])

но результат таков:

$`5216014`
$`5216014`[[1]]
NULL


$`5216208`
$`5216208`[[1]]
NULL

Я пытался преобразовать l во фрейм данных:

data.frame(matrix(unlist(l)))

но я получил один большой столбец со всеми данными как:

kingdom
phylum
class
order
family
genus
species
Animalia
Chordata
Elasmobranchii
4943
Rajiformes
Rajidae
Raja
Raja montagui
1
44
121
884
5877
2342057
5216014
4954
kingdom
phylum
class
order
family
genus
species
Animalia
Chordata
Elasmobranchii
Rajiformes
4965
Rajidae
Amblyraja
Amblyraja radiata
1
44
121
884
5877
2420436
2420446
kingdom
phylum
class
order
family
genus
species 

Где я не прав?

P.S: этот вид list l является выводом пакетов rgbif, с кодом:

    keySpecies <- c(5216014,2420446)
    l.1 <- occ_search(taxonKey=keySpecies,
      limit=1, return='hier',
      curlopts=list(verbose=F))
l <- l.1[c(1:length(unique(keySpecies)))] #cut all element of list that are not useful

1 Ответ

0 голосов
/ 13 ноября 2018

lapply(l,function(x) x[7]) близко, но вам нужно индексировать [row, column], а не просто [row]. Вместо этого сделайте это:

res = lapply(l,function(x) x[7, c("name", "key")])
# or more simply
res = lapply(l, "[", 7, c("name", "key"))

Это все равно даст вам list, который вам нужно будет объединить в один фрейм данных:

do.call(rbind, res)

Редактировать: я установил ваш пакет и запустил ваш код, и, очевидно, l - это список списков фреймов данных, а не список фреймов данных. Поэтому нам нужно извлечь это также:

res = lapply(lapply(l, "[[", 1), "[", 7, c("name", "key"))
res = do.call(rbind, res)
res
#                      name     key
# 5216014     Raja montagui 5216014
# 2420446 Amblyraja radiata 2420446
...