Це питання вже кілька років, але я натрапив на нього, а це означає, що, можливо, інші.
readr
Бібліотека / пакет має деякі корисні функції до нього. Один з них - це приємний спосіб інтерпретувати "брудні" стовпці, як ці.
library(readr)
read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5",
col_types = list(col_numeric())
)
Це дає
Джерело: локальний кадр даних [4 x 1]
numbers
(dbl)
1 800.0
2 1800.0
3 3500.0
4 6.5
Важливий момент при читанні у файлах: вам або потрібно попередньо обробити, як коментар вище щодо sed
, або вам доведеться обробляти під час читання . Часто, якщо ви намагаєтеся виправити речі після факту, є деякі небезпечні припущення, які важко знайти. (Через що плоскі файли в першу чергу настільки злі.)
Наприклад, якби я не поставив прапор col_types
, я отримав би це:
> read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5")
Source: local data frame [4 x 1]
numbers
(chr)
1 800
2 1,800
3 3500
4 6.5
(Зауважте, що тепер це chr
( character
) замість а numeric
.)
Або, що ще небезпечніше, якби воно було досить довгим і більшість ранніх елементів не містили коми:
> set.seed(1)
> tmp <- as.character(sample(c(1:10), 100, replace=TRUE))
> tmp <- c(tmp, "1,003")
> tmp <- paste(tmp, collapse="\"\n\"")
(так, що останні кілька елементів виглядають :)
\"5\"\n\"9\"\n\"7\"\n\"1,003"
Тоді ви взагалі знайдете проблеми з читанням цієї коми!
> tail(read_csv(tmp))
Source: local data frame [6 x 1]
3"
(dbl)
1 8.000
2 5.000
3 5.000
4 9.000
5 7.000
6 1.003
Warning message:
1 problems parsing literal data. See problems(...) for more details.
setAs("character", "logical.Y.N", function(from) c(Y=TRUE,N=FALSE)[from] )
).