【问题标题】:Subset a list of strings by the first word按第一个单词对字符串列表进行子集
【发布时间】:2020-12-28 11:18:23
【问题描述】:

是否可以对字符串列表进行子集化,例如使用 grepl 列出 [1:3]?我想识别字符串中的第一个单词以开始索引并以匹配的字符串的第一个单词结束索引。

我不想使用数字索引的原因是我计划对多个财务报表 pdf 进行子集化,并且它们可能在列表中包含的内容方面有所不同。

这是我拥有的数据:

list(c("CASH $99,999,999.00 $99,999,999.00 0.00"), 
    c("CASH SLIPS 1,000,000.00 1,000,000.00 0.00"), 
    c("BONDS 500,000.00 (500,000.00)"), 
    c("ACCOUNTS RECEIVABLE 1,000,000.00 2,000,000.00 (1,000,000.00)"))

我将如何从 CASH 开始子集,即完全匹配,而不是 CASH SLIPS,并以 BONDS 结束?

期望的输出:

list(c("CASH $99,999,999.00 $99,999,999.00 0.00"), 
        c("CASH SLIPS 1,000,000.00 1,000,000.00 0.00"), 
        c("BONDS 500,000.00 (500,000.00)"))

【问题讨论】:

  • 您想要的列表显示CASH SLIPS,而描述为. the exact match, not CASH SLIPS,
  • 当我尝试使用回复时,我注意到它同时匹配 CASH 和 CASH SLIPS。所以你的答案就是我想要的。

标签: r string list


【解决方案1】:

我们可以从base R使用Filter

Filter(function(x) grepl("^(CASH|BONDS)", x), lst1)
#[[1]]
#[1] "CASH $99,999,999.00 $99,999,999.00 0.00"

#[[2]]
#[1] "CASH SLIPS 1,000,000.00 1,000,000.00 0.00"

#[[3]]
#[1] "BONDS 500,000.00 (500,000.00)"

如果我们想根据“CASH”的起始索引和“BONDS”的结束索引进行子集化,也可以选择其他选项

i1 <- sub("\\s+[^A-Z]+", "", unlist(lst1)) %in% c("CASH", "BONDS")
lst1[Reduce(`:`, as.list(range(which(i1))))]
#[[1]]
#[1] "CASH $99,999,999.00 $99,999,999.00 0.00"

#[[2]]
#[1] "CASH SLIPS 1,000,000.00 1,000,000.00 0.00"

#[[3]]
#[1] "BONDS 500,000.00 (500,000.00)"

或使用grepl

lst1[Reduce(`:`, as.list(range(grep("^(CASH|BONDS)\\s+([^A-Z])", unlist(lst1)))))]
#[[1]]
#[1] "CASH $99,999,999.00 $99,999,999.00 0.00"

#[[2]]
#[1] "CASH SLIPS 1,000,000.00 1,000,000.00 0.00"

#[[3]]
#[1] "BONDS 500,000.00 (500,000.00)"

或使用purrr中的keep

library(stringr)
library(purrr)
keep(lst1, ~ str_detect(.x, '^(CASH|BONDS)'))

或者sapplyword

lst1[sapply(lst1, word, 1) %in% c("CASH", "BONDS")]

【讨论】:

    【解决方案2】:

    您可以提取单词,直到每个列表都遇到一个数字或"$" 符号。

    first_word <- sapply(data, function(x) sub('(.*?)\\s(\\d+|\\$).*', '\\1', x))
    first_word
    #[1] "CASH"    "CASH SLIPS"     "BONDS"    "ACCOUNTS RECEIVABLE"
    

    并使用这些first_word 从列表中选择以"CASH" 开头并以"BONDS" 结尾的元素。

    data[which(first_word == 'CASH'):which(first_word == 'BONDS')]
    
    #[[1]]
    #[1] "CASH $99,999,999.00 $99,999,999.00 0.00"
    
    #[[2]]
    #[1] "CASH SLIPS 1,000,000.00 1,000,000.00 0.00"
    
    #[[3]]
    #[1] "BONDS 500,000.00 (500,000.00)"
    

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      • 2012-11-26
      相关资源
      最近更新 更多