【发布时间】:2015-03-16 05:57:40
【问题描述】:
我找到了许多示例,说明如何使用一个模式和一个替换来匹配和更新整个列表,但我现在正在寻找一种在单个语句或循环中为多个模式和多个替换执行此操作的方法.
例子:
> print(recs)
phonenumber amount
1 5345091 200
2 5386052 200
3 5413949 600
4 7420155 700
5 7992284 600
我想插入一个名为“service_provider”的新列,其中 /^5/ 作为 Company1,/^7/ 作为 Company2。
我可以用以下两行 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'))
在其他语言中,我会在电话公司列表上使用 for 循环
For every row in thisPhoneCompanies
Add service provider to matched entries in recs (such as the grepl statement)
end loop
但我知道在 R 中 不是这样做的方法。
【问题讨论】:
-
包
stringi是你的朋友:docs.rexamine.com/R-man/stringi/stringi-arguments.html -
将您的数据存储在一个data.frame中,例如
phcomp <- data.frame(ph=c(5,7),comp=c("Comp1","Comp2")),然后根据您的主要数据df$new <- phcomp$comp[match(substr(df$phonenumber,1,1), phcomp$ph)]与之匹配