【问题标题】:R read data set which has unequal columnR读取具有不相等列的数据集
【发布时间】:2018-05-08 01:11:56
【问题描述】:

我有一个 .csv 数据集,它由“,”分隔,大约有 5,000 行和“5”列。

但是,对于某些列,内容还包含“,”,例如:

2660,11-01-2016,70.75,05-06-2013,I,,,

4080,26-02-2016,59.36,,D

因此,当我尝试用read_delim() 阅读它时,它会抛出我warnings,但结果应该没问题,例如:

警告:7 次解析失败。

row # A tibble: 5 x 5 col row col 预期实际文件预期实际 1 309 5 列 8 列 'data/my_data.csv' 文件 2 523 5 列 7 列 'data/my_data.csv' 行 3 588 5列 8 列 'data/my_data.csv' col 4 1661 5 列 9 列 'data/my_data.csv' 预期 5 1877 5 列 7 列 'data/my_data.csv'

有什么办法可以解决这个问题吗?

我想我可以使用read_Lines() 并一个一个地处理它,然后将它们变成一个数据框。

你有没有其他方法来处理这种情况?

【问题讨论】:

  • 如果您的分隔符是逗号,但您的数据包含原始的、未转义的逗号,那么read.table 无法区分。您可以转义包含逗号数据的列,也可以按照您的建议手动读取每一行。

标签: r csv readr


【解决方案1】:

1) read.table with fill=TRUE 使用 fill=TRUEread.table 不会产生警告:

Lines <- "2660,11-01-2016,70.75,05-06-2013,I,,,
4080,26-02-2016,59.36,,D"

# replace text = Lines with your filename    
read.table(text = Lines, sep = ",", fill = TRUE)

给予:

    V1         V2    V3         V4 V5 V6 V7 V8
1 2660 11-01-2016 70.75 05-06-2013  I NA NA NA
2 4080 26-02-2016 59.36             D NA NA NA

2) 用分号替换第一个 4 逗号 另一种方法是:

# replace textConnection(Lines) with your filename
L <- readLines(textConnection(Lines))
for(i in 1:4) L <- sub(",", ";", L)
read.table(text = L, sep = ";")

给予:

    V1         V2    V3         V4   V5
1 2660 11-01-2016 70.75 05-06-2013 I,,,
2 4080 26-02-2016 59.36               D

3) 删除行尾的逗号 另一种可能性是删除行尾的逗号。 (如果您在 Windows 上,则 sed 在 Rtools 发行版中。)

read.table(pipe("sed -e s/,*$// readtest.csv"), sep = ",")

给予:

    V1         V2    V3         V4 V5
1 2660 11-01-2016 70.75 05-06-2013  I
2 4080 26-02-2016 59.36             D

3a) 类似于 (3) 但没有 sed

# replace textConnection(Lines) with your filename
L <- readLines(textConnection(Lines))
read.table(text = sub(",*$", "", L), sep = ",")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2020-03-05
    • 2015-06-28
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多