在列中删除并求和

时间:2019-08-21 10:39:28

标签: r gsub

我想从一栏中删除不必要的信息,以求总计。

Col_X当前在一个整体中有多个部分,并由其5位数字段“ 19651”划分。段号需要删除,货币需要移动到新的列,并且总计。

因此,对于最后一部分,应该有两列显示

Col_X  | CCY  
429.34 | EUR

Col_X  
19651: 10 GBP  
19662: 1.2 GBP  
19663: 6 GBP  
19852: 108.88 EUR  
19926: 147 EUR | 39927: 86.9 EUR | 39928: 49.35 EUR  
19994: 30.95 EUR | 29990: 298.4 EUR | 19996: 99.99 EUR  

我试图删除数字的第一部分,但是失败了-所以我正在努力找出如何在我需要的关键数据之间删除它们。

Col_X <- gsub("^.?:","",bill$Col_X)

代码的第一部分未能从一开始删除任何数字。

1 个答案:

答案 0 :(得分:1)

您可以使用类似的方法:删除除货币值以外的所有值,并对每个条目求和。然后,从每个单词中抓取3个字母的单词。然后,将它们粘贴在一起:

x <-  c("10 GBP", "1.2 GBP", "6 GBP", "108.88 EUR", "147 EUR | 39927: 86.9 EUR | 39928: 49.35 EUR")
amounts <- lapply(x, function(m) sum(scan(text=gsub("\\s*(?:\\d+:|[A-Z]+)\\s*", "", m), sep="|", what = numeric(), quiet=TRUE)))
currency <- sub(".*?\\b([A-Z]{3})\\b.*", "\\1", x)
paste(amounts, currency, sep=" ") 
## => [1] "10 GBP"     "1.2 GBP"    "6 GBP"      "108.88 EUR" "283.25 EUR"

请参见R demo online

gsub("\\s*(?:\\d+:|[A-Z]+)\\s*", "", m) removes

  • \s*-0 +空格
  • (?:\d+:|[A-Z]+)-1个以上的数字和后面的:或1个以上的大写ASCII字母
  • \s*-0 +空格

sub(".*?\\b([A-Z]{3})\\b.*", "\\1", x) "extracts"的前三个字母的货币代码:

  • .*?-尽可能少包含0个字符
  • \b([A-Z]{3})\b-第1组(\1):一个单词边界,3个ASCII字母,一个单词边界
  • .*-尽可能多0个字符