我有一个像
这样的CSV文件Market,CampaignName,Identity
Wells Fargo,Gary IN MetroChicago IL Metro,56
EMC,Los Angeles CA MetroBoston MA Metro,78
Apple,Cupertino CA Metro,68
所需输出到CSV文件,第一行为标题
Market,City,State,Identity
Wells Fargo,Gary,IN,56
Wells Fargo,Chicago,IL,56
EMC,Los Angeles,CA,78
EMC,Boston,MA,78
Apple,Cupertino,CA,68
res <-
gsub('(.*) ([A-Z]{2})*Metro (.*) ([A-Z]{2}) .*','\\1,\\2:\\3,\\4',
xx$Market)
如何修改上述正则表达式以获得R中的结果? R的新手,感谢任何帮助。
答案 0 :(得分:5)
library(stringr)
xx.to.split <- with(xx, setNames(gsub("Metro", "", as.character(CampaignName)), Market))
do.call(rbind, str_match_all(xx.to.split, "(.+?) ([A-Z]{2}) ?"))[, -1]
产地:
[,1] [,2]
Wells Fargo "Gary" "IN"
Wells Fargo "Chicago" "IL"
EMC "Los Angeles" "CA"
EMC "Boston" "MA"
Apple "Cupertino" "CA"
即使您在每个市场中拥有不同数量的Compaign Name,这也应该有效。不幸的是我认为基本选项很难实现,因为令人沮丧的是没有gregexec
,尽管如果有人想出一些比较紧凑的东西,我会很好奇。
答案 1 :(得分:3)
以下是使用基础R的解决方案。拆分字符串CampaignName
上的Metro
列,将序号添加为名称。 stack
将其转换为包含ind
和values
列的数据框,我们将其按到DF1
。将xx
与DF1
的序号以及xx
的行号合并。将Market
移至DF2
的前面,然后移除ind
和CampaignName
。最后把它写出来。
xx <- read.csv("Campaign.csv", as.is = TRUE)
s <- strsplit(xx$CampaignName, " Metro")
names(s) <- seq_along(s)
ss <- stack(s)
DF1 <- with(ss, data.frame(ind,
City = sub(" ..$", "", values),
State = sub(".* ", "", values)))
DF2 <- merge(DF1, xx, by.x = "ind", by.y = 0)
DF <- DF2[ c("Market", setdiff(names(DF2), c("ind", "Market", "CampaignName"))) ]
write.csv(DF, file = "myfile.csv", row.names = FALSE, quote = FALSE)
修改以在海报修改问题后处理额外的列以包含此类。小改进。