我是R的新人,希望得到一些帮助。
我有一个数据框,其中包含服务付款的名称和相应费用,格式如下:
"Doe, Jane 12,345.67"
"Doe, John 1,234,567.89"
"Doe-Smith, Adam 999,000.00"
现在名称和付款都在一栏中。我如何能够提取付款并将其放入新列?我尝试使用正则表达式,到目前为止我有:
.*\s(\d+,*\d+,*\d+.\d+)
似乎它正在努力匹配字符串并获取薪水,但我应该从哪里开始?
答案 0 :(得分:0)
假设名称永远不能包含任何数字,那么使用sub
有一个相当简单的方法:
df <- data.frame(data=c("Doe, Jane 12,345.67",
"Doe, John 1,234,567.89",
"Doe-Smith, Adam 999,000.00"))
df$payment <- sub(".*?(?=\\d)", "", df$data, perl=TRUE)
df$name <- sub("\\s+\\d+.*", "", df$data)
df
data payment name
1 Doe, Jane 12,345.67 12,345.67 Doe, Jane
2 Doe, John 1,234,567.89 1,234,567.89 Doe, John
3 Doe-Smith, Adam 999,000.00 999,000.00 Doe-Smith, Adam
答案 1 :(得分:0)
与@ TimBiegeleisen的解决方案类似,但转换为numeric
:
# Sample data
s <- c("Doe, Jane 12,345.67",
"Doe, John 1,234,567.89",
"Doe-Smith, Adam 999,000.00")
as.numeric(gsub(",", "", sub(".+\\s(\\d+[\\d\\.,]+)", "\\1", s)))
#[1] 12345.67 1234567.89 999000.00
说明:使用sub
删除名称部分,仅保留包含小数分隔符的数字;然后使用gsub
全局删除小数点分隔符并转换为numeric
。
答案 2 :(得分:0)
您可以使用tidyverse中的separate
library(tidyverse)
df%>%separate(data,c("names","payment"),"(?<=[a-z])\\s")
names payment
1 Doe, Jane 12,345.67
2 Doe, John 1,234,567.89
3 Doe-Smith, Adam 999,000.00