【问题标题】:Access last element in a list within a tibble访问小标题内列表中的最后一个元素
【发布时间】:2019-05-15 20:30:15
【问题描述】:

我使用关键字搜索从 pdf 中提取数据,最终将结果汇总在一个小标题中。这很好,但是现在我想进一步总结一下tibble的“token_text”列表中存储的数据,我特别只对每行列表的最后一个元素感兴趣。但是,我知道如何在列表中提取元素的函数似乎在 tibble 中不起作用?

例如如果我有一个列表元素“a”,那么我可以访问该列表中的最后一个元素:

sapply(a,tail,1)

但是这在 tibble 中似乎不起作用:

result$token_text, tail,1)

因为这只给了我整个列表,而不是列表的最后一个元素。 我错过了什么?

下面是我的“结果”标题的一个输入。

提前感谢您的帮助。

structure(list(keyword = c("124-38-9", "124-38-9", "124-38-9", 
"124-38-9", "124-38-9", "124-38-9", "124-38-9", "124-38-9", "124-38-9", 
"124-38-9", "124-38-9", "124-38-9", "124-38-9", "124-38-9", "74-82-8", 
"74-82-8", "74-82-8", "74-82-8", "74-82-8", "74-82-8", "74-82-8", 
"74-82-8", "74-82-8", "74-82-8", "10024-97-2", "10024-97-2", 
"10024-97-2", "10024-97-2", "10024-97-2", "10024-97-2", "10024-97-2", 
"10024-97-2", "10024-97-2", "10024-97-2"), page_num = c(20L, 
21L, 21L, 21L, 21L, 21L, 22L, 22L, 22L, 23L, 23L, 24L, 24L, 24L, 
21L, 21L, 22L, 22L, 23L, 23L, 23L, 24L, 24L, 24L, 21L, 21L, 22L, 
22L, 23L, 23L, 23L, 24L, 24L, 24L), line_num = c(500L, 503L, 
504L, 516L, 517L, 518L, 527L, 533L, 542L, 550L, 559L, 567L, 573L, 
579L, 505L, 519L, 528L, 534L, 545L, 551L, 560L, 568L, 574L, 580L, 
506L, 520L, 529L, 535L, 546L, 552L, 561L, 569L, 575L, 581L), 
    line_text = list("124-38-9                         CO2 nonbio             8812.3593                8812.3593", 
        "124-38-9                         CO2 bio-nC   0                     0", 
        "124-38-9                         CO2 bio-C    0                     0", 
        "124-38-9                         CO2 nonbio   0                     0", 
        "124-38-9                         CO2 bio-nC   0                     0", 
        "124-38-9                         CO2 bio-C    0                     0", 
        "124-38-9                         CO2  8411.7989              8411.7989", 
        "124-38-9                         CO2  0                      0", 
        "124-38-9                         CO2  392.9536               392.9536", 
        "124-38-9                         CO2  4.0087                 4.0087", 
        "124-38-9                         CO2  3.5981                 3.5981", 
        "124-38-9                         CO2 0                      0", 
        "124-38-9                         CO2 0                      0", 
        "124-38-9                         CO2 0                      0", 
        "74-82-8                          CH4          83.0642               2076.6050", 
        "74-82-8                          CH4          0                     0", 
        "74-82-8                          CH4  7.8340                 195.8500", 
        "74-82-8                          CH4  0                      0", 
        "74-82-8                          CH4  2.0398                 50.9950", 
        "74-82-8                          CH4  30.4243                760.6075", 
        "74-82-8                          CH4  42.7661                1069.1525", 
        "74-82-8                          CH4 0                      0", 
        "74-82-8                          CH4 0                      0", 
        "74-82-8                          CH4 0                      0", 
        "10024-97-2                       N2O          0.2146                63.9508", 
        "10024-97-2                       N2O          0                     0", 
        "10024-97-2                       N2O  0.2139                 63.7422", 
        "10024-97-2                       N2O  0                      0", 
        "10024-97-2                       N2O  0.0007                 0.2086", 
        "10024-97-2                       N2O  0                      0", 
        "10024-97-2                       N2O  0                      0", 
        "10024-97-2                       N2O 0                      0", 
        "10024-97-2                       N2O 0                      0", 
        "10024-97-2                       N2O 0                      0"), 
    token_text = list(list(c("124", "38", "9", "co2", "nonbio", 
    "8812.3593", "8812.3593")), list(c("124", "38", "9", "co2", 
    "bio", "nc", "0", "0")), list(c("124", "38", "9", "co2", 
    "bio", "c", "0", "0")), list(c("124", "38", "9", "co2", "nonbio", 
    "0", "0")), list(c("124", "38", "9", "co2", "bio", "nc", 
    "0", "0")), list(c("124", "38", "9", "co2", "bio", "c", "0", 
    "0")), list(c("124", "38", "9", "co2", "8411.7989", "8411.7989"
    )), list(c("124", "38", "9", "co2", "0", "0")), list(c("124", 
    "38", "9", "co2", "392.9536", "392.9536")), list(c("124", 
    "38", "9", "co2", "4.0087", "4.0087")), list(c("124", "38", 
    "9", "co2", "3.5981", "3.5981")), list(c("124", "38", "9", 
    "co2", "0", "0")), list(c("124", "38", "9", "co2", "0", "0"
    )), list(c("124", "38", "9", "co2", "0", "0")), list(c("74", 
    "82", "8", "ch4", "83.0642", "2076.6050")), list(c("74", 
    "82", "8", "ch4", "0", "0")), list(c("74", "82", "8", "ch4", 
    "7.8340", "195.8500")), list(c("74", "82", "8", "ch4", "0", 
    "0")), list(c("74", "82", "8", "ch4", "2.0398", "50.9950"
    )), list(c("74", "82", "8", "ch4", "30.4243", "760.6075")), 
        list(c("74", "82", "8", "ch4", "42.7661", "1069.1525"
        )), list(c("74", "82", "8", "ch4", "0", "0")), list(c("74", 
        "82", "8", "ch4", "0", "0")), list(c("74", "82", "8", 
        "ch4", "0", "0")), list(c("10024", "97", "2", "n2o", 
        "0.2146", "63.9508")), list(c("10024", "97", "2", "n2o", 
        "0", "0")), list(c("10024", "97", "2", "n2o", "0.2139", 
        "63.7422")), list(c("10024", "97", "2", "n2o", "0", "0"
        )), list(c("10024", "97", "2", "n2o", "0.0007", "0.2086"
        )), list(c("10024", "97", "2", "n2o", "0", "0")), list(
            c("10024", "97", "2", "n2o", "0", "0")), list(c("10024", 
        "97", "2", "n2o", "0", "0")), list(c("10024", "97", "2", 
        "n2o", "0", "0")), list(c("10024", "97", "2", "n2o", 
        "0", "0")))), row.names = c(NA, -34L), class = c("tbl_df", 
"tbl", "data.frame"))

【问题讨论】:

  • 哇大数据转储。如果尝试将样本数据减少到必要的位,我们总是很感激

标签: r list tibble


【解决方案1】:

tidyverse 我会这样做:

result %>% 
  mutate_at(vars(token_text), ~map_chr(.,~last(.[[1]])))
# A tibble: 34 x 5
#     keyword page_num line_num line_text token_text
#       <chr>    <int>    <int>    <list>      <chr>
#  1 124-38-9       20      500 <chr [1]>  8812.3593
#  2 124-38-9       21      503 <chr [1]>          0
#  3 124-38-9       21      504 <chr [1]>          0
#  4 124-38-9       21      516 <chr [1]>          0
#  5 124-38-9       21      517 <chr [1]>          0
#  6 124-38-9       21      518 <chr [1]>          0
#  7 124-38-9       22      527 <chr [1]>  8411.7989
#  8 124-38-9       22      533 <chr [1]>          0
#  9 124-38-9       22      542 <chr [1]>   392.9536
# 10 124-38-9       23      550 <chr [1]>     4.0087
# ... with 24 more rows

如果您只想要token 列的内容,请添加%&gt;% pull(token_text)

【讨论】:

    【解决方案2】:
    with(result, sapply(token_text, function(x) tail(x[[1]], 1)))
    
    [1] "8812.3593" "0"         "0"         "0"         "0"         "0"        
     [7] "8411.7989" "0"         "392.9536"  "4.0087"    "3.5981"    "0"        
    [13] "0"         "0"         "2076.6050" "0"         "195.8500"  "0"        
    [19] "50.9950"   "760.6075"  "1069.1525" "0"         "0"         "0"        
    [25] "63.9508"   "0"         "63.7422"   "0"         "0.2086"    "0"        
    [31] "0"         "0"         "0"         "0"        
    

    或更多tidyverseish:

    library(dplyr)
    result %>% 
      pull(token_text) %>% 
      sapply(function(x) last(unlist(x)))
    

    【讨论】:

      【解决方案3】:

      token_text 是一个列表列,因此您需要进一步使用[[ 访问列表元素。这是使用来自purrrmap_chr 的解决方案。

      library(purrr)
      
      map_chr(result$token_text, ~tail(.[[1]], 1)) 
      # [1] "8812.3593" "0"         "0"         "0"         "0"         "0"        
      # [7] "8411.7989" "0"         "392.9536"  "4.0087"    "3.5981"    "0"        
      # [13] "0"         "0"         "2076.6050" "0"         "195.8500"  "0"        
      # [19] "50.9950"   "760.6075"  "1069.1525" "0"         "0"         "0"        
      # [25] "63.9508"   "0"         "63.7422"   "0"         "0.2086"    "0"        
      # [31] "0"         "0"         "0"         "0"  
      

      【讨论】:

        【解决方案4】:

        您可以通过以下方式做到这一点...

        result$last_token <- sapply(result$token_text, function(x) tail(x[[1]], 1))
        

        您需要在列表列表中sapply 并一次执行一个。这假设last_token 的每个元素都是一个长度为1 的列表,其中包含一个向量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-10
          • 2017-08-06
          相关资源
          最近更新 更多