2014-10-20 22 views
6

Tôi đang có nhu cầu nhập khẩu các file csv vào R, với dòng trống đầu tiên không phải cung cấp tên của các cột khung dữ liệu. Tôi biết rằng bạn có thể cung cấp đối số skip = 0 để chỉ định dòng nào cần đọc đầu tiên. Tuy nhiên, số hàng của dòng đầu tiên không trống có thể thay đổi giữa các tệp.Bỏ qua tất cả dòng trống hàng đầu trong read.csv

Làm thế nào để tìm ra bao nhiêu dòng là trống rỗng, và tự động bỏ qua chúng cho mỗi tập tin?

Như đã chỉ ra trong các ý kiến, tôi cần phải làm rõ những gì có nghĩa là "trống". Tệp csv của tôi trông giống như:

,,, 
w,x,y,z 
a,b,5,c 
a,b,5,c 
a,b,5,c 
a,b,4,c 
a,b,4,c 
a,b,4,c 

có nghĩa là có hàng dấu phẩy lúc bắt đầu.

Trả lời

7

read.csv tự động bỏ qua các dòng trống (trừ khi bạn đặt blank.lines.skip=FALSE). Xem ?read.csv

Sau khi viết ở trên, áp phích giải thích rằng các dòng trống không thực sự trống nhưng có dấu phẩy trong chúng nhưng không có gì giữa dấu phẩy. Trong trường hợp đó, hãy sử dụng fread từ gói data.table để xử lý điều đó. Đối số skip= có thể được thiết lập để bất kỳ chuỗi ký tự được tìm thấy trong các tiêu đề:

library(data.table) 
DT <- fread("myfile.csv", skip = "w") # assuming w is in the header 
DF <- as.data.frame(DT) 

Dòng cuối cùng có thể được bỏ qua nếu có data.table là ok như giá trị trả về.

+1

Good catch. Vì vậy, miễn là các dòng 'trống' là hoàn toàn trống rỗng của bất kỳ nhân vật này chỉ nên làm việc. OP có lẽ nên làm rõ bản chất của dữ liệu của họ. – thelatemail

+0

Tôi đã cố gắng sử dụng 'blank.lines.skip = TRUE', và tôi đã tự hỏi tại sao nó không hoạt động. Nó chỉ ra rằng các dòng trống chứa dấu phẩy. – Alex

+0

Có bất kỳ dấu trừ nào bỏ qua các dòng trống trong hiệu suất không? - - Tôi có mỗi dòng thứ hai trống trong nỗ lực của tôi, thực sự mọi dòng lẻ đều trống. - - Tôi muốn giữ dữ liệu nguyên bản nhất có thể. –

2

Tùy thuộc vào kích thước tập tin của bạn, điều này có thể không phải là giải pháp tốt nhất nhưng sẽ thực hiện công việc.

Chiến lược ở đây là, thay vì đọc tệp có dấu phân cách, sẽ đọc dưới dạng dòng, và đếm các ký tự và lưu vào trạng thái tạm thời. Sau đó, trong khi vòng lặp sẽ tìm kiếm đầu tiên chiều dài nhân vật khác không có trong danh sách, sau đó sẽ đọc các tập tin và lưu trữ như data_filename.

flist = list.files() 
for (onefile in flist) { 
    temp = nchar(readLines(onefile)) 
    i = 1 
    while (temp[i] == 0) { 
    i = i + 1 
    } 
    temp = read.table(onefile, sep = ",", skip = (i-1)) 
    assign(paste0(data, onefile), temp) 
} 

Nếu tập tin chứa tiêu đề, bạn có thể bắt đầu từ i 2.

2

Nếu cặp vợ chồng đầu tiên của dòng sản phẩm nào thực sự trống rỗng, sau đó read.csv sẽ tự động chuyển sang dòng đầu tiên. Nếu họ có dấu phẩy nhưng không có giá trị, thì bạn có thể sử dụng:

df = read.csv(file = 'd.csv') 
df = read.csv(file = 'd.csv',skip = as.numeric(rownames(df[which(df[,1]!=''),])[1])) 

Không hiệu quả nếu bạn có tệp lớn (vì bạn phải nhập hai lần), nhưng nó hoạt động.

Nếu bạn muốn nhập một tập tin được phân định với cùng một vấn đề (dòng trống biến) sau đó sử dụng:

df = read.table(file = 'd.txt',sep='\t') 
df = read.table(file = 'd.txt',skip = as.numeric(rownames(df[which(df[,1]!=''),])[1])) 
+0

phát hiện bằng dấu phẩy, nhưng điều này cũng sẽ hoạt động với tab được phân cách đúng không? – Alex

+0

Không có chức năng 'read.csv'. Bạn sẽ gặp lỗi vì hàm đang tìm dấu phẩy. – CephBirk

Các vấn đề liên quan