如何导入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;。
有人知道一招吗? 非常感谢!
答案 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