在 R 中,使用正则表达式匹配多个模式并将新列添加到列表
In R, use regular expression to match multiple patterns and add new column to list
我找到了很多关于如何使用一个模式和一个替换来匹配和更新整个列表的示例,但我现在正在寻找的是一种在单个语句中针对多个模式和多个替换执行此操作的方法或循环。
示例:
> print(recs)
phonenumber amount
1 5345091 200
2 5386052 200
3 5413949 600
4 7420155 700
5 7992284 600
我想插入一个名为 'service_provider' 的新列,Company1 为 /^5/,Company2 为 /^7/。
我可以用下面两行 R:
recs$service_provider[grepl("^5", recs$phonenumber)]<-"Company1"
recs$service_provider[grepl("^7", recs$phonenumber)]<-"Company2"
然后我得到:
phonenumber amount service_provider
1 5345091 200 Company1
2 5386052 200 Company1
3 5413949 600 Company1
4 7420155 700 Company2
5 7992284 600 Company2
我想提供一个列表,而不是离散的 grepl 集,这样更容易将特定国家/地区的信息放在一个地方,而将所有编程逻辑放在另一个地方。
thisPhoneCompanies<-list(c('^5','Company1'),c('^7','Company2'))
在其他语言中,我会在 Phone 公司列表中使用 for 循环
For every row in thisPhoneCompanies
Add service provider to matched entries in recs (such as the grepl statement)
end loop
但我知道在 R 中不是这样做的方法
感谢@thelatemail
看起来如果我使用数据框而不是 phone 公司的列表:
phcomp <- data.frame(ph=c(5,7),comp=c("Company1","Company2"))
我可以在单个命令中匹配并向我的 phone 个数字列表添加一个新列(使用匹配函数)。
recs$service_provider <- phcomp$comp[match(substr(recs$phonenumber,1,1), phcomp$ph)]
看来我失去了使用正则表达式的能力,不过这里的匹配很简单,就是phone号的第一个数字
使用stringi
:
library(stringi)
recs$service_provider <- stri_replace_all_regex(str = recs$phonenumber,
pattern = c('^5.*','^7.*'),
replacement = c('Company1', 'Company2'),
vectorize_all = FALSE)
recs
# phonenumber amount service_provider
# 1 5345091 200 Company1
# 2 5386052 200 Company1
# 3 5413949 600 Company1
# 4 7420155 700 Company2
# 5 7992284 600 Company2
我找到了很多关于如何使用一个模式和一个替换来匹配和更新整个列表的示例,但我现在正在寻找的是一种在单个语句中针对多个模式和多个替换执行此操作的方法或循环。
示例:
> print(recs)
phonenumber amount
1 5345091 200
2 5386052 200
3 5413949 600
4 7420155 700
5 7992284 600
我想插入一个名为 'service_provider' 的新列,Company1 为 /^5/,Company2 为 /^7/。
我可以用下面两行 R:
recs$service_provider[grepl("^5", recs$phonenumber)]<-"Company1"
recs$service_provider[grepl("^7", recs$phonenumber)]<-"Company2"
然后我得到:
phonenumber amount service_provider
1 5345091 200 Company1
2 5386052 200 Company1
3 5413949 600 Company1
4 7420155 700 Company2
5 7992284 600 Company2
我想提供一个列表,而不是离散的 grepl 集,这样更容易将特定国家/地区的信息放在一个地方,而将所有编程逻辑放在另一个地方。
thisPhoneCompanies<-list(c('^5','Company1'),c('^7','Company2'))
在其他语言中,我会在 Phone 公司列表中使用 for 循环
For every row in thisPhoneCompanies
Add service provider to matched entries in recs (such as the grepl statement)
end loop
但我知道在 R 中不是这样做的方法
感谢@thelatemail
看起来如果我使用数据框而不是 phone 公司的列表:
phcomp <- data.frame(ph=c(5,7),comp=c("Company1","Company2"))
我可以在单个命令中匹配并向我的 phone 个数字列表添加一个新列(使用匹配函数)。
recs$service_provider <- phcomp$comp[match(substr(recs$phonenumber,1,1), phcomp$ph)]
看来我失去了使用正则表达式的能力,不过这里的匹配很简单,就是phone号的第一个数字
使用stringi
:
library(stringi)
recs$service_provider <- stri_replace_all_regex(str = recs$phonenumber,
pattern = c('^5.*','^7.*'),
replacement = c('Company1', 'Company2'),
vectorize_all = FALSE)
recs
# phonenumber amount service_provider
# 1 5345091 200 Company1
# 2 5386052 200 Company1
# 3 5413949 600 Company1
# 4 7420155 700 Company2
# 5 7992284 600 Company2