2013-06-25 21 views
11

Trong R, có chức năng như read.csv đọc trong tệp có tiêu đề ở bên trái (hoặc phải) trái ngược với đầu và dữ liệu được sắp xếp từ trái sang phải không?Đọc tệp CSV được sắp xếp theo chiều ngang

Vì vậy, các dữ liệu sẽ như thế nào:

var1,1,2,3,4,5 

Nhìn vào tài liệu cho read.tableread.csv, không có gì dường như bật ra. Các tùy chọn tốt nhất tôi thấy bằng cách sử dụng những chức năng này là sử dụng read.table và sau đó xây dựng một bảng có cột là các hàng của dữ liệu gốc và vv.

+0

Bạn có thể cho một ví dụ tối thiểu 2 hoặc 3 dòng cách của bạn dữ liệu văn bản trông như thế nào? Bạn có nghĩa là mỗi dòng giống như: 'var1,1,2,3,4,5'? – thelatemail

+0

Vâng, chính xác như vậy. Vì vậy, tiêu đề trong trường hợp này là cột nhiều nhất bên trái. –

+1

* nếu * tất cả các biến số là số thì bạn có thể làm như bạn đề xuất; 'x <- read.csv (...); y <- setNames (as.data.frame (t (x [, - 1])), as.character (x [, 1])) ' –

Trả lời

14

Giả sử các tệp của bạn được gọi là 'data.csv' và nó chứa:

var1,1,2,3,4,5,6 
var2,2.1,3.9,4.6,5.2,6.1 
var3,M,F,M,F,M,M 

Note var1var3 có 6 giá trị nhưng var2 chỉ có 5. Vì vậy, ý tưởng là để đọc dữ liệu, chuyển nó và sau đó sử dụng read.csv.

read.tcsv = function(file, header=TRUE, sep=",", ...) { 

    n = max(count.fields(file, sep=sep), na.rm=TRUE) 
    x = readLines(file) 

    .splitvar = function(x, sep, n) { 
    var = unlist(strsplit(x, split=sep)) 
    length(var) = n 
    return(var) 
    } 

    x = do.call(cbind, lapply(x, .splitvar, sep=sep, n=n)) 
    x = apply(x, 1, paste, collapse=sep) 
    out = read.csv(text=x, sep=sep, header=header, ...) 
    return(out) 

} 

Sau đó, bạn có thể làm:

read.tcsv ("data.csv")

var1 var2 var3 
1 1 2.1 M 
2 2 3.9 F 
3 3 4.6 M 
4 4 5.2 F 
5 5 6.1 M 
6 6 NA M