2013-07-06 122 views
11

我最近遇到了一個問題,每次我讀取一個包含帶有值的表的csv文件時,R都會以列表格式而不是數字讀取它。由於沒有任何線索爲我提供了完整的答案,所以一旦我能夠讓它運行,我決定在這裏包含對我有用的腳本,希望對某人有用。在這裏,有一些描述和一些選項以備需要時使用:從R列表轉換爲數字

(1)從csv文件中讀取數據。這裏,文件沒有頭,所以我把女,如果你有一個頭,然後將其更改爲T.

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

(1.A)注意:如果你是說一個警告「不完整的最後一行找到通過readTableHeader「,這意味着R沒有找到文件結束符號。只需在csv文件末尾添加一個額外的空行,該消息就不會再顯示出來。 (2)您可以使用mode命令檢查數據是否爲列表格式(如果它是數字,那麼您已經設置完畢,根本不需要此過程!)。

mode(data) 

(3)使用數據的維度初始化一個矩陣(如NA),數據格式爲數據格式。

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

(4)可選:如果您想要的名字添加到您的列和/或行,你可以使用一個,如果這些選項。

(4A)名稱添加到行和列,假設每個有類似的信息,換句話說,你希望被COL_1的名字,COL_2,......和row_1,row_2,...

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

(4b)如果你想爲每一列和每一行使用不同的名字,那麼改用這個選項並手動添加所有名字。

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

(5)從列表中變換數據,以數字形式,並把它在基質中dataNum。

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

(6)您可以使用mode命令檢查矩陣是否爲數字格式。

mode(dataNum) 

(7)可選:如果您想轉置矩陣,可以使用以下說明。

dataNum <- t(dataNum) 
+6

不要在問題中包含答案。把我們想要解決的問題寫成問題並提交答案作爲實際答案...... – Dason

+1

我認爲這可能更適合您的博客或類似內容。正如@Dason指出的那樣,這並不適合本網站的問答風格。如果您不確定如何在網站上發佈信息,請查看[** faq **](http://stackoverflow.com/faq)。儘管付出很大的努力,只需要一點點修改就可以將其重新調整爲問答。 –

回答

19

這裏是把你的data.frame爲數字矩陣較短/更快的方法:

data <- data.matrix(data) 

還有

data <- as.matrix(data) 

,但一個重要的區別是,如果你的數據包含因子或字符列:as.matrix將強制所有內容轉換爲字符矩陣,而data.matrix將始終返回numericinteger矩陣。

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

這兩種方法(原文或答案都不適用)適用於我,所以我仍然無法獲得rowSums ... – SiKiHe

+0

@SikiHe:不是一個非常有建設性的評論,你能詳細說明嗎?也許用一個可重複的例子創建你自己的問題,並從這裏鏈接到它... – flodel

+0

我有和上面完全一樣的問題,這就是爲什麼我認爲沒有必要創建我自己的帖子。我正在導入一個csv文件,並試圖獲取rowSums,但得到一個錯誤消息,rowSums的輸入必須是數字。我嘗試了這裏描述的兩種方法,但都沒有工作。也就是說,要麼數字轉換成行列,所以rowSums是不正確的,因爲它不是原來的數字,或者它們不是數字,也不能在第一位添加。 – SiKiHe