2013-07-06 48 views
11

Gần đây tôi đã gặp sự cố trong đó mỗi lần đọc tệp csv chứa bảng có giá trị, R đọc nó dưới dạng định dạng danh sách thay vì số. Vì không có luồng nào cung cấp cho tôi toàn bộ câu trả lời cho tình huống của tôi, một khi tôi có thể chạy nó, tôi quyết định đưa vào đây kịch bản làm việc cho tôi với hy vọng rằng nó hữu ích cho ai đó. Dưới đây là, với một số mô tả và một số tùy chọn trong trường hợp bạn cần:Chuyển đổi từ danh sách sang số trong R

(1) Đọc dữ liệu từ tệp csv. Ở đây, file không có tiêu đề, vì vậy tôi đặt F, nếu bạn có một tiêu đề, sau đó thay đổi nó để T.

data <- read.csv("folder_path/data_file.csv", header=F) 

(1.a) Lưu ý: Nếu bạn nhận được một cảnh báo nói rằng "không đầy đủ dòng cuối cùng tìm thấy bởi readTableHeader ", điều đó có nghĩa là R không tìm thấy biểu tượng kết thúc tệp. Chỉ cần đặt thêm một dòng trống ở cuối tệp csv và thông báo sẽ không hiển thị lại.

(2) Bạn có thể kiểm tra xem dữ liệu có ở định dạng danh sách không (nếu nó là số, thì bạn đã hoàn tất và không cần thủ tục này!) Với lệnh chế độ.

mode(data) 

(3) Khởi tạo một ma trận (như NA), nơi bạn muốn dữ liệu ở định dạng số, sử dụng kích thước của dữ liệu.

dataNum <- matrix(data = NA, nrow = dim(data)[1], ncol = dim(data)[2]) 

(4) TÙY CHỌN: Nếu bạn muốn thêm tên vào cột và/hoặc hàng, bạn có thể sử dụng tên nếu các tùy chọn này.

(4a) Thêm tên vào các cột và các hàng, giả định rằng mỗi người đều có thông tin tương tự, nói cách khác mà bạn muốn tên được col_1, col_2, ... và row_1, row_2, ...

colnames(dataNum) <- colnames(dataNum, do.NULL = F, prefix = "col_") 
rownames(dataNum) <- rownames(dataNum, do.NULL = F, prefix = "row_") 

(4b) Nếu bạn muốn tên khác nhau cho mỗi cột và mỗi hàng, sau đó sử dụng tùy chọn này thay thế và thêm tất cả các tên bằng tay.

colnames(dataNum) <- c("col_name_1", "col_name_2") 
rownames(dataNum) <- c("row_name_1", "row_name_2") 

(5) Chuyển đổi dữ liệu từ danh sách sang dạng số và đặt nó vào dữ liệu ma trậnNum.

for (i in 1:dim(data)[2]) { 
    dataNum[,i] <- c(as.numeric(data[[i]])) 
} 

(6) Bạn có thể kiểm tra xem ma trận ở định dạng số có lệnh chế độ hay không.

mode(dataNum) 

(7) TÙY CHỌN: Trong trường hợp bạn muốn chuyển ma trận, bạn có thể sử dụng hướng dẫn sau.

dataNum <- t(dataNum) 
+6

Không bao gồm câu trả lời trong câu hỏi.Viết vấn đề của chúng tôi mà bạn muốn giải quyết là câu hỏi và gửi câu trả lời dưới dạng câu trả lời thực tế ... – Dason

+1

Tôi nghĩ điều này có thể phù hợp hơn trên blog của bạn hoặc tương tự. Như @ Dason chỉ ra, điều này không thực sự phù hợp với phong cách Hỏi & Đáp của trang web này. Kiểm tra [** faq **] (http://stackoverflow.com/faq) nếu bạn muốn biết chi tiết nếu bạn không chắc chắn về cách đăng bài trên trang web. Mặc dù nỗ lực tốt, chỉ cần chỉnh sửa một chút để tập trung lại thành Giải Đáp. –

Trả lời

19

Đây là một/cách nhanh hơn ngắn hơn để biến data.frame của bạn vào một ma trận số:

data <- data.matrix(data) 

Ngoài ra còn có

data <- as.matrix(data) 

nhưng một sự khác biệt quan trọng là nếu dữ liệu của bạn chứa cột yếu tố hoặc ký tự: as.matrix sẽ ép mọi thứ vào ma trận ký tự trong khi data.matrix sẽ luôn trả lại numeric hoặc integer ma trận.

data <- data.frame(
    logical = as.logical(c(TRUE, FALSE)), 
    integer = as.integer(c(TRUE, FALSE)), 
    numeric = as.numeric(c(TRUE, FALSE)), 
    factor = as.character(c(TRUE, FALSE)) 
) 

data.matrix(data) 
#  logical integer numeric factor 
# [1,]  1  1  1  2 
# [2,]  0  0  0  1 

as.matrix(data) 
#  logical integer numeric factor 
# [1,] " TRUE" "1"  "1"  "TRUE" 
# [2,] "FALSE" "0"  "0"  "FALSE" 
+2

Cả hai cách tiếp cận (bài viết gốc hoặc câu trả lời dưới đây) đều có tác dụng đối với tôi, vì vậy tôi vẫn không thể nhận được rowSums ... – SiKiHe

+0

@ SikiHe: không phải là một nhận xét mang tính xây dựng, bạn có thể xây dựng được không? Có thể tạo câu hỏi của riêng bạn với một ví dụ tái tạo và liên kết với nó từ đây ... – flodel

+0

Tôi có cùng một vấn đề như trên, đó là lý do tại sao tôi nghĩ rằng nó không cần thiết để tạo ra bài viết của riêng tôi. Tôi đang nhập tệp csv và cố gắng lấy rowSums, nhưng nhận được thông báo lỗi rằng đầu vào cho rowSums phải là số. Tôi đã thử cả hai cách tiếp cận được mô tả ở đây và không ai trong số họ làm việc. Đó là, hoặc là những con số đã được chuyển đổi thành hàng ngũ và do đó rowSums là không chính xác vì nó không phải là con số ban đầu đã được thêm vào, hoặc họ không phải là số và không thể được thêm vào ở nơi đầu tiên. – SiKiHe