2015-10-06 84 views
1

我想讀的CSV文件完全相同的格式如下:的R - 對包含數千數字列讀取CSV分離器

Date,x,y 
"2015/08/01","71,131","20,390" 
"2015/08/02","81,599","23,273" 
"2015/08/03","79,435","21,654" 
"2015/08/04","80,733","20,924" 

的分隔符是逗號,但每個值也被封入因爲報價用作千位分隔符的逗號。我嘗試了{readr}中的read.csv,read_csv和{data.table}中的fread,我能做的最好的是讀取所有值爲字符串,然後使用as.numericgsub的組合將它們轉換爲數字。

我也發現這個:Most elegant way to load csv with point as thousands separator in R這是非常有用的,但我的數據有很多列(不是所有的數字),我寧可不指定列類型。

任何想法或我應該開始gsub ing?在有趣的一面,Excel讀取文件就好:)

+0

你知道哪些列已進行改造? – Jaap

+0

@Jaap我想,但至少它會正確讀取它。剛纔看到他們已經試過了。 nvm –

+0

David - 我不確定那會完成什麼。無論如何,我得到這個錯誤:'期望的sep(''),但新行,EOF(或其他非打印字符)結束字段4時檢測類型(第一):輸入新的日期:(mm-dd-yy)' – BogdanC

回答

2

你應該可以通過read.csv讀取數據。下面的例子

#write data 
write('Date,x,y\n"2015/08/01","71,131","20,390"\n"2015/08/02","81,599","23,273"\n"2015/08/03","79,435","21,654"\n"2015/08/04","80,733","20,924"',"test.csv") 

#use "text" rather than "file" in read.csv 
#perform regex substitution before using read.csv 
#the outer gsub with '(?<=\\d),(\\d{3})(?!\\d)' performs the thousands separator substitution 
#the inner gsub replaces all \" with ' 
read.csv(text=gsub('(?<=\\d),(\\d{3})(?!\\d)', 
        '\\1', 
        gsub("\\\"", 
         "'", 
         paste0(readLines("test.csv"),collapse="\n")), 
        perl=TRUE), 
     header=TRUE, 
     quote="'", 
     stringsAsFactors=FALSE) 

結果

#  Date  x  y 
#1 2015/08/01 71131 20390 
#2 2015/08/02 81599 23273 
#3 2015/08/03 79435 21654 
#4 2015/08/04 80733 20924 
+0

@BogdanC請檢查一些樣本數據。如果正則表達式正確處理所有可能的輸入,很難預先說明。 – cryo111

+0

@cyro - 哇!我沒有給出正確的表達方式。我在一些真實數據上測試了它的效果很好,我喜歡我不必爲列名或類型進行調整。謝謝! – BogdanC

+0

@BogdanC很高興工作!順便說一句:你可以通過包含引號'''使正則表達式模式更具限制性(因此可能更安全)。 – cryo111

2

隨着data.table包,你可以做到這一點,如下所示:

1:創建COLUMNNAMES的載體進行改造。在這種情況下,Date必須被排除。

cols <- setdiff(names(dt),"Date") 

2:應用轉換功能,其餘列:

library(data.table) 
dt[, (cols) := lapply(.SD, function(x) as.numeric(gsub(",", "", x))), .SDcols = cols] 

這導致:

> dt 
     Date  x  y 
1: 2015/08/01 71131 20390 
2: 2015/08/02 81599 23273 
3: 2015/08/03 79435 21654 
4: 2015/08/04 80733 20924 

使用的數據:

dt <- fread('Date,x,y 
      "2015/08/01","71,131","20,390" 
      "2015/08/02","81,599","23,273" 
      "2015/08/03","79,435","21,654" 
      "2015/08/04","80,733","20,924"') 
0

最好的解決方案是在導出之前從Excel工作表中刪除所有這些格式。

做不到這一點,只需使用lapply每一列轉換:

df[c("x", "y")] <- lapply(df[c("x", "y")], function(x) as.numeric(gsub(",", "", x)))