如何分离CSV文件中特定列的变量并写入R中的CSV文件?

时间:2014-02-26 02:05:55

标签: regex r csv

我有一个像

这样的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的新手,感谢任何帮助。

2 个答案:

答案 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将其转换为包含indvalues列的数据框,我们将其按到DF1。将xxDF1的序号以及xx的行号合并。将Market移至DF2的前面,然后移除indCampaignName。最后把它写出来。

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)

修改以在海报修改问题后处理额外的列以包含此类。小改进。