2011-10-30 67 views
5

我正在導入3列CSV文件。最後一列是一系列條目,它們是整數或引號中的字符串。讀取csv文件,在一列中包含數字和字符串

這裏有一系列的例子條目:

1,4,"m" 
1,5,20 
1,6,"Canada" 
1,7,4 
1,8,5 

當我導入此使用read.csv,這些都只是上繳因素。

我該如何設置它們以便將它們讀作整數和字符串?

謝謝!

回答

8

這是不可能的,因爲給定的載體可以僅具有單個模式(例如characternumeric,或者logical)。

然而,可以將矢量分割成兩個分開的載體,一個具有數字值和與字符值,第二:

vec <- c("m", 20, "Canada", 4, 5) 

vnum <- as.numeric(vec) 
vchar <- ifelse(is.na(vnum), vec, NA) 

vnum 
[1] NA 20 NA 4 5 

vchar 
[1] "m"  NA  "Canada" NA  NA  
+0

安德麗你說的和我一樣,但更好。 –

+0

@ user718281,讀爲字符串,而不是因素,使用read.csv(...,stringsAsFactors = FALSE) – Max

+0

感謝Andrie。 有一件事我不太確定該怎麼做,但我該如何從csv文件轉到矢量。如在,我的理解是,read.csv輸出一個矩陣,而不是一個向量。 – evt

2

編號A數據幀是一系列粘貼在一起向量(向量的列表或矩陣)。因爲每一列都是一個向量,所以它不能被歸類爲整數和因子。它必須是一個或另一個。你可以將矢量拆分爲數字和因子(每個都有一個acolumn),但我不相信這是你想要的。

6

編輯儘管OP決定接受這個答案,@ Andrie的答案是首選的解決方案。我的答案僅僅是爲了通知數據幀的一些奇怪特徵。

正如其他人所指出的,簡短的回答是,這是不可能的。 data.frame s旨在包含單個原子類型的列。 @安德里的建議是一個很好的建議,但只是爲了踢,我認爲我會指出一種方法來將這種類型的數據刻入data.frame

您可以將違規列轉換爲列表(此代碼假定您已經設置options(stringsAsFactors = FALSE)):

dat <- read.table(textConnection("1,4,'m' 
1,5,20 
1,6,'Canada' 
1,7,4 
1,8,5"),header = FALSE,sep = ",") 

tmp <- as.list(as.numeric(dat$V3)) 
tmp[c(1,3)] <- dat$V3[c(1,3)] 
dat$V3 <- tmp 

str(dat) 
'data.frame': 5 obs. of 3 variables: 
$ V1: int 1 1 1 1 1 
$ V2: int 4 5 6 7 8 
$ V3:List of 5 
    ..$ : chr "m" 
    ..$ : num 20 
    ..$ : chr "Canada" 
    ..$ : num 4 
    ..$ : num 5 

現在,有種種原因,爲什麼這是一個壞主意。舉個例子,很多你期望和data.frame很好地搭配的代碼不會這樣,並且要麼失敗,要麼表現得很奇怪。但我想我會把它當作一種好奇心指出來。

+0

+1僅僅因爲這是一個壞主意! – Andrie

+0

雖然這很殘酷,但我正在辯論出現更糟的情況。 :) – Iterator

+0

嗯,實際上,這對我來說是不可重現的。 V3的值是5,1,4,2,3,類是int,num,int,num,num。解決方法:'選項(stringsAsFactors = FALSE)'。 – Iterator

相關問題