R 从列中删除罗马数字

R remove roman numerals from column

我在 R 中有一个 table,其中包含以下信息。 employee 中有些行有罗马数字,有些没有:

employee <- c('JOHN SMITH II','PETER RABBIT','POPE GREGORY XIII', 'MARY SUE IV')
salary <- c(21000, 23400, 26800, 100000)
employee_df <- data.frame(employee, salary)
> employee_df
           employee salary
1     JOHN SMITH II  21000
2      PETER RABBIT  23400
3 POPE GREGORY XIII  26800
4       MARY SUE IV 100000

我如何删除罗马数字,以便 employee_df$employee 成为下面的数字?

JOHN SMITH    PETER RABBIT    POPE GREGORY   MARY SUE

试试这个:

#Code
employee_df$employee <-gsub('^([0-9]+)|([IVXLCM]+)\.?$','',employee_df$employee)

输出:

       employee salary
1   JOHN SMITH   21000
2  PETER RABBIT  23400
3 POPE GREGORY   26800
4     MARY SUE  100000

或清洁工:

#Code2
employee_df$employee <- trimws(gsub('^([0-9]+)|([IVXLCM]+)\.?$','',employee_df$employee))

输出:

      employee salary
1   JOHN SMITH  21000
2 PETER RABBIT  23400
3 POPE GREGORY  26800
4     MARY SUE 100000

正则表达式的数字部分不是必需的(非常感谢 @BenBolker)。您可以使用:

#Code3
employee_df$employee <- trimws(gsub('([IVXLCM]+)\.?$','',employee_df$employee))

得到相同的结果。

如果您是认真的,那么您不是想要删除带有POPE的字符串中的罗马数字。如果这是正确的,那么删除所有其他数字的方法是:

sub("^(?!\bPOPE\b)(.*?)\s[IVXLCM]+$", "\1", employee_df$employee, perl = T)
[1] "JOHN SMITH"        "PETER RABBIT"      "POPE GREGORY XIII" "MARY SUE"

这里我们使用负先行 (?!...) 断言字符串不能包含子字符串 POPE,并且反向引用 \1 到 'recollect' 之前匹配的任何内容字符串末尾的罗马数字序列。

选项str_remove

library(dplyr)
library(stringr)
employee_df %>%
        mutate(employee = str_remove(employee, "\s+[IVXLCM]+"))