Câu hỏi này đã có từ vài năm trước, nhưng tôi đã tình cờ gặp nó, có nghĩa là có thể những người khác sẽ làm.
Các readr
thư viện / gói có một số tính năng tốt đẹp với nó. Một trong số đó là một cách hay để giải thích các cột "lộn xộn", như thế này.
library(readr)
read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5",
col_types = list(col_numeric())
)
Điều này mang lại
Nguồn: khung dữ liệu cục bộ [4 x 1]
numbers
(dbl)
1 800.0
2 1800.0
3 3500.0
4 6.5
Một điểm quan trọng khi đọc trong tệp: bạn phải xử lý trước, như nhận xét ở trên về sed
hoặc bạn phải xử lý trong khi đọc . Thông thường, nếu bạn cố gắng sửa chữa mọi thứ sau thực tế, có một số giả định nguy hiểm được đặt ra rất khó tìm ra. (Đó là lý do tại sao các tập tin phẳng ngay từ đầu rất tệ.)
Ví dụ: nếu tôi không gắn cờ col_types
, tôi sẽ nhận được điều này:
> 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
(Lưu ý rằng nó bây giờ là một chr
( character
) thay vì a numeric
.)
Hoặc, nguy hiểm hơn, nếu nó đủ dài và hầu hết các phần tử ban đầu không chứa dấu phẩy:
> set.seed(1)
> tmp <- as.character(sample(c(1:10), 100, replace=TRUE))
> tmp <- c(tmp, "1,003")
> tmp <- paste(tmp, collapse="\"\n\"")
(sao cho một số phần tử cuối cùng trông giống như vậy :)
\"5\"\n\"9\"\n\"7\"\n\"1,003"
Sau đó, bạn sẽ thấy khó khăn khi đọc dấu phẩy đó!
> 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] )
).