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]+"))
我在 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]+"))