如何从此列表(从rgbif)中提取值并将其转换为R中的数据帧?

时间:2018-11-13 14:23:11

标签: r list dataframe lapply

我有此列表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

我只想提取rowname列的key数字7并创建一个像这样的数据库:

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 :(得分:1)

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