2013-08-10 56 views
41

Khi đọc trong dữ liệu của tôi đặt trong R như sau:Lỗi trong đọc trong tập dữ liệu vào R

Dataset.df <- read.table("C:\\dataset.txt", header=T) 

tôi nhận được thông báo lỗi sau:

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 
    line 1 did not have 145 elements 

Điều đó có nghĩa và có thể ai đó cho tôi biết làm thế nào để sửa chữa nó?

Trả lời

56

Lỗi này khá dễ hiểu. Dường như có dữ liệu bị thiếu trong dòng đầu tiên của tệp dữ liệu của bạn (hoặc dòng thứ hai, vì trường hợp này có thể do bạn đang sử dụng header = TRUE).

Dưới đây là một ví dụ nhỏ:

## Create a small dataset to play with 
cat("V1 V2\nFirst 1 2\nSecond 2\nThird 3 8\n", file="test.txt") 

R tự động phát hiện rằng nó nên mong đợi rownames cộng với hai cột (3 yếu tố), nhưng nó không tìm thấy 3 yếu tố trên dòng 2, vì vậy bạn nhận được một lỗi:

read.table("test.txt", header = TRUE) 
# Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 
# line 2 did not have 3 elements 

nhìn vào tập tin dữ liệu và xem liệu có thực sự là một vấn đề:

cat(readLines("test.txt"), sep = "\n") 
# V1 V2 
# First 1 2 
# Second 2 
# Third 3 8 

Manua Có thể cần điều chỉnh l hoặc chúng tôi có thể giả định giá trị đầu tiên trong hàng "Thứ hai" phải nằm trong cột đầu tiên và các giá trị khác phải là NA. Nếu trường hợp này xảy ra, fill = TRUE là đủ để giải quyết vấn đề của bạn.

read.table("test.txt", header = TRUE, fill = TRUE) 
#  V1 V2 
# First 1 2 
# Second 2 NA 
# Third 3 8 

R cũng đủ thông minh để con nó ra bao nhiêu yếu tố cần thiết ngay cả khi rownames đang thiếu:

cat("V1 V2\n1\n2 5\n3 8\n", file="test2.txt") 
cat(readLines("test2.txt"), sep = "\n") 
# V1 V2 
# 1 
# 2 5 
# 3 8 
read.table("test2.txt", header = TRUE) 
# Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 
# line 1 did not have 2 elements 
read.table("test2.txt", header = TRUE, fill = TRUE) 
# V1 V2 
# 1 1 NA 
# 2 2 5 
# 3 3 8 
17

Khi chạy vào lỗi này và xem xét dữ liệu của tôi mà dường như có không có dữ liệu bị thiếu, tôi phát hiện ra rằng một vài mục nhập của tôi có ký tự đặc biệt "#" làm trật tự nhập dữ liệu. Khi tôi đã xóa "#" khỏi các ô vi phạm, dữ liệu được nhập không có vấn đề.

+10

Bạn cũng có thể đặt 'read.table (..., comment.char =" ")' để tắt cách diễn giải các nhận xét trong tệp. –

+11

Các dấu nháy đơn cũng có thể gây ra nó ('). Sửa lỗi này bằng cách đặt tùy chọn quote = "\" " – Stuart

5

Tôi gặp sự cố này khi nhập một số tệp từ dữ liệu Thêm sức khỏe vào R (xem: http://www.icpsr.umich.edu/icpsrweb/ICPSR/studies/21600?archive=ICPSR&q=21600) Ví dụ: lệnh sau để đọc tệp dữ liệu DS12 ở định dạng .tsv được phân tách bằng tab sẽ tạo ra lỗi sau:

ds12 <- read.table("21600-0012-Data.tsv", sep="\t", comment.char="", 
quote = "\"", header=TRUE) 

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, 
na.strings, : line 2390 did not have 1851 elements 

Dường như có sự cố định dạng nhỏ với một số tệp khiến R từ chối tệp. Ít nhất một phần của vấn đề dường như thỉnh thoảng sử dụng dấu ngoặc kép thay vì dấu nháy đơn khiến một số ký tự ngoặc kép không đồng đều trong một dòng.

Sau khi loay hoay, tôi đã xác định được ba giải pháp khả thi:.

  1. Mở tập tin trong một trình soạn thảo văn bản và tìm kiếm/thay thế tất cả các trường hợp của một nhân vật quote "không có gì Nói cách khác, xóa tất cả đôi Đối với dữ liệu được phân cách bằng tab này, điều này có nghĩa là chỉ một số trích đoạn chính xác của các nhận xét từ các chủ đề không còn trong dấu ngoặc kép mà không phải là vấn đề cho việc phân tích dữ liệu của tôi.) hoặc lưu trữ khác giải pháp khác là tải xuống dữ liệu ở định dạng mới.Một lựa chọn tốt trong trường hợp này là để tải phiên bản Stata của DS12 và sau đó mở nó bằng cách sử dụng lệnh read.dta như sau:

    library(foreign) 
    ds12 <- read.dta("21600-0012-Data.dta") 
    
  2. Một liên quan giải pháp/hack là để mở file .tsv trong Excel và lưu lại dưới dạng tệp văn bản được phân tách bằng tab. Điều này dường như để làm sạch bất cứ vấn đề định dạng làm cho R không hài lòng.

Không có lý do nào trong số này lý tưởng vì chúng không giải quyết được vấn đề trong R với tệp .tsv gốc nhưng việc sắp xếp dữ liệu thường đòi hỏi phải sử dụng nhiều chương trình và định dạng.

-1

Một trong các biến của tôi là phân loại với một thay thế là chuỗi đa ("không có sự kiện"). Khi tôi sử dụng read.table, nó giả định rằng không gian sau chuỗi đầu tiên có nghĩa là kết thúc của điểm dữ liệu và chuỗi thứ hai được đẩy đến biến tiếp theo. Tôi đã sử dụng sep = "\ t" để giải quyết vấn đề. Tôi đã sử dụng RStudio trong môi trường Mac OX. Giải pháp trước đó là chuyển đổi các tệp .txt thành .csv trong Excel và sau đó mở chúng bằng hàm read.csv. yếu tố

+0

Đã bỏ phiếu xuống. Các tiện ích mở rộng không liên quan đến R. Bạn có thể sử dụng read.csv() cho dù tệp được gọi là something.txt hay something.xls hoặc something.csv, miễn là cũng lưu ý là read.csv() cũng giống như read.table (sep = ',', header = TRUE). Nó chỉ là một cách viết tắt cho phần sau. –

1

Đối với những người không thể tìm thấy một giải pháp và biết các dữ liệu không là mất tích:

Tôi có vấn đề này khi tôi sử dụng Excel 2013 để lưu file như .csv và sau đó cố gắng để tải chúng vào R bằng cách sử dụng read.table(). Cách khắc phục mà tôi đã tìm thấy là dán dữ liệu trực tiếp từ Excel vào tài liệu .txt, sau đó mở bằng:

read.table(file.choose(), sep="\t"). 

Tôi hy vọng điều này sẽ hữu ích.

2

Nếu bạn đang sử dụng Linux và tệp dữ liệu là từ cửa sổ. Có thể do ký tự^M Tìm và xóa. đã hoàn tất!

0

Tôi gặp phải lỗi này khi tôi có hàng.names = "id" (theo số tutorial) với cột có tên là "id".