单独的名称与付款

时间:2018-02-23 01:50:32

标签: r regex

我是R的新人,希望得到一些帮助。

我有一个数据框,其中包含服务付款的名称和相应费用,格式如下:

"Doe, Jane 12,345.67"
"Doe, John 1,234,567.89"
"Doe-Smith, Adam 999,000.00"

现在名称和付款都在一栏中。我如何能够提取付款并将其放入新列?我尝试使用正则表达式,到目前为止我有:

.*\s(\d+,*\d+,*\d+.\d+)

似乎它正在努力匹配字符串并获取薪水,但我应该从哪里开始?

3 个答案:

答案 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

Demo

答案 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