2016-12-13 17 views
1

我有一个CSV文件,其中包含逗号:“Afganis,tan” 我想用“_”替换逗号,所以我使用以下gsub statments。 但是,当我打印结果数据框时,我看到该值分为两部分:一个在同一列(“Afganis”),第二个(“tan”)插入到下一列。我怎样才能克服这个问题,所以我会得到“Afganis_tan”?有没有办法将gsub函数插入read.csv函数? 附加是我试过的相关代码。如何将gsub函数插入到read.csv函数

df<- read.csv(inFile$datapath, header = input$header, sep = input$sep, quote = "") 
ind<-sapply(1:ncol(df), function(x) { class(df[,x])=="factor"}) 
     print(ind) 
     ind<-which(ind==TRUE) 
     if(length(ind)==1){ 

     df[,ind]<-gsub('[^a-zA-Z0-9.]',"_",as.character(df[,ind])) 
     df[,ind]<-df('\\,',"_",as.character(df[,ind])) 
     df[,ind]<-df(',',"_",as.character(df[,ind])) 
     df[,ind]<-as.factor(df[,ind]) 
     } 

这里是输出(第9行是有问题的):

campaign_type    country_name   transaction_type cpa_price  TIERS Year_Success_20. 
1   CPM    Afgha nistan     Domestic   0 TIER_4_Asia    0 
2   CPM    Afg' hanistan     Domestic   0 TIER_4_Asia    0 
3   CPM   Afgh' (anistan) Cross Optimized Advertiser   0 TIER_4_Asia    1 
4   CPM    Afgha-nistan     Domestic   0 TIER_4_Asia    0 
5   CPM   "Afghan""istan""" Cross Optimized Advertiser   0 TIER_4_Asia    0 
6   CPM Afghan~!#$%^@&*()_+|istan     Domestic   0 TIER_4_Asia    0 
7   CPM    Afghanistan     Domestic   0 TIER_4_Asia    0 
8   CPM    Afghanistan.     Domestic   0 TIER_4_Asia    0 
9   CPM     "Afghan      istan" Domestic 0.040995321  TIER_4_Asia 
10                           
11   CPM    Afghanistan     Domestic   0 TIER_4_Asia    1 

附件是链接到该文件。 File with versions to the string "Afganistan"

+0

你应该做出[重现的实例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproduc ible-example)并包含样本数据。在将数据读入'df'后,'read.csv'确实与转换没有任何关系。只需包含一个'df'的输入。你想做什么与'df('\\,',“_”,as.character(df [,ind]))'' - 你似乎在调用'df()'作为一个函数。 “SPY”从哪里来? – MrFlick

+0

您可以使用'data.table'库中的'fread()'函数。可以使用终端命令作为输入而不是文件路径,并在路径中应用gsub(或Windows等价物)。您还可以设置'sep2'参数来尝试和检测引号分隔符。 –

+0

@MrFlick,我按照你的建议添加了更多信息。 – mql4beginner

回答

2

如果你可以保存CSV文件中使用了引号标识符(使用双引号分隔字段“),那么你就可以避免这个问题。然后read.csv()(或从data.table库我个人的偏好fread())可以通过编程来寻找双引号的外逗号分割。

还可以在fread()使用终端命令作为输入,并使用该数据正则表达式,因为它是在输送。

+0

谢谢@Oliver Forst,不幸的是我不能使用外部库。 – mql4beginner

+1

'系统(“系统命令与gsub”,实习生= TRUE)'可以给你你需要的东西。否则,您可能必须简单地读取它并在R中操作它。 另外,以'abc,def'为例。如果逗号是有意的(并且不存在空格)的情况与逗号是偶然的并且字段实际上应该是'abcdef'的情况相比,你如何区分?最好的解决方案是使用不同的分隔符或带引号的标识符重新加载该文件。 –

+0

谢谢@Oliver Forst,感谢解决方法的建议,我在哪里插入这行代码? – mql4beginner