【问题标题】:Remove & sum within column在列内删除和求和
【发布时间】:2019-08-21 10:39:28
【问题描述】:

我想从列中删除不必要的信息,目的是汇总金额。

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)

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

【问题讨论】:

  • 你好。我看到您在同一行上有多个除以“|”的段。您是否还需要删除其他部分?只删除第一部分就可以了gsub('^\\d*:\\s', '', bill$Col_X)
  • 嗨史蒂夫。出于某种原因,该代码没有从列中删除任何内容。是的,理想情况下我需要关闭每个部分,一次做一个更好吗?
  • 您能粘贴当前数据框对象的dput() 输出吗?
  • ``` c("10 GBP", "1.2 GBP", "6 GBP", "108.88 EUR", "147 EUR | 39927: 86.9 EUR | 39928: 49.35 EUR", `` ` 似乎它在 dput 上已关闭,但在我 head(df) 时却没有
  • 嘿。这可能不是所有dput() 输出。检查here 以获得有关如何生成dput() 输出的良好解释/方式。

标签: r regex gsub


【解决方案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+ 个字符

【讨论】:

  • 这太棒了。一口气解决了整个问题。非常感谢您的工作故障。我要离线分析一下!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
相关资源
最近更新 更多