在調用read.csv
時,以下是列分類問題的可能解決方法。
假設我不想在將數據讀入R之後更改類,如果我想將一列設置爲character
,將其他設置爲默認類,則可以使用readLines
快速讀取第一行.csv(即列標題行,如果存在),並設置一個向量,以傳遞給參數read.csv
的colClasses
。
這裏有一個簡單的功能,
col.classes <- function(csv, col, class){
g <- readLines(csv, n = 1)
n <- unlist(strsplit(g, ","))
col.classes <- ifelse(n %in% col, class, NA)
return(col.classes)
}
爲了說明其工作原理,假設我有一個名爲cats.csv文件(它只是恰巧,我這樣做),我知道我想要的權重列爲類character
,其餘列爲默認類。請記住,colClasses
可以是一個字符向量,對於NA
的元素,相應的數據列將被跳過並歸類,就好像沒有讀取colClasses
一樣。
查看列的名稱的文件中
names(read.csv('cats.csv'))
## [1] "cats" "colour" "length" "weight" "mu"
視圖缺省類從read.csv
> sapply(read.csv('cats.csv'), class)
## cats colour length weight mu
## "integer" "factor" "integer" "integer" "integer"
樣品試驗:
(1)類的長度列numeric
在撥打read.csv
,而留下其他作爲各自默認
> cc1 <- col.classes('cats.csv', 'length', 'numeric')
> rr1 <- read.csv('cats.csv', colClasses = cc1)
> sapply(rr1, class)
## cats colour length weight mu
## "integer" "factor" "numeric" "integer" "integer"
(2)同樣,類重量列character
> cc2 <- col.classes('cats.csv', 'weight', 'character')
> rr2 <- read.csv('cats.csv', colClasses = cc2)
> sapply(rr2, class)
## cats colour length weight mu
## "integer" "factor" "integer" "character" "integer"
不知道有沒有什麼幫助你的。當我想要一些列類的混合時,我覺得它很有用,否則這些列類可能會變得笨重,並且一旦數據已經加載到R就會令人沮喪地改變。
也在read.csv中,您可以添加arg as.is = T和它會阻止轉換爲因子 – ZRoss