R:Quotationsmarks +中的数据导入数字+逗号分隔

时间:2016-09-19 15:29:14

标签: r csv import

如何导入csv文件,如果

1)  sep = ","
2a) numbers are identified by ""
2b) dec = ","

数据示例(csv)

Col1,Col2,Col3
1,f,"1,20"
0,m,"1,01"
1,m,"1,00" 

期望的输出(在R中,例如作为数据帧)

   Col1 Col2 Col3
1    1    f 1.20
2    0    m 1.01
3    1    f 1.00

我尝试了各种版本的read.csv2,read.csv,fread - 并获取了错误消息"标题数量过多的列#34;。

有人知道一招吗? 非常感谢!

1 个答案:

答案 0 :(得分:1)

让我们补充一些假数据。首先,让我们获取您发布的数据:

Col1,Col2,Col3
1,f,"1,20"
0,m,"1,01"
1,m,"1,00" 

并将其另存为csv文件。我是在Mac的文本编辑器中手动完成的(复制和粘贴)。我将文件保存为" fake.csv"。您可以自己继续这样做,也可以从Dropbox链接下载我创建的链接(是的,我知道外部链接不受欢迎,但我还提供了重现示例的Dropbox的替代方案)。这是link

如果你有一个特别大的数据集,或许你想要使用readr加载它,它可以很好地处理大型数据集。但是,您注意到,使用read_csv导入时,,会完全从字符串中删除,而read_delim(file, delim=",")也是如此。

data<-as.data.frame(read_csv("PATH/fake.csv"))
Parsed with column specification:
cols(
  Col1 = col_integer(),
  Col2 = col_character(),
  Col3 = col_number()
)
data
  Col1 Col2 Col3
1    1    f  120 # no comma
2    0    m  101 #''      ''
3    1    m  100 #''      ''

一种,也许是笨重的方式,解决这个问题是在管道中使用以下代码。这里的逻辑是你的所有数字都以第100位的最后一位数结束。

data %>% 
   group_by('Col1', 'Col2', 'Col3') %>% 
   mutate(Col3=str_replace(data$Col3, "\\d\\d$", gsub("^\\d", ".", data$Col3))) %>% 
   as.data.frame() %>% 
   select(1,2,3)

  Col1 Col2 Col3
1    1    f 1.20
2    0    m 1.01
3    1    m 1.00

作为一项功能:

import_csv<-function(x) {

    library(readr)
    library(dplyr)

    data <-read_csv(x)

    data <-data %>% 
        group_by('Col1', 'Col2', 'Col3') %>% 
        mutate(Col3=str_replace(data$Col3, "\\d\\d$", gsub("^\\d", ".", data$Col3))) %>% 
        as.data.frame() %>% 
        select(1,2,3)

    print(data)

}

import_csv("PATH/fake.csv")
Parsed with column specification:
cols(
  Col1 = col_integer(),
  Col2 = col_character(),
  Col3 = col_number()
)
  Col1 Col2 Col3
1    1    f 1.20
2    0    m 1.01
3    1    m 1.00