2012-10-08 31 views
23

請考慮以下R代碼。使用cbind從兩個向量創建數據幀

> x = cbind(c(10, 20), c("[]", "[]"), c("[[1,2]]","[[1,3]]")) 
> x 
    [,1] [,2] [,3]  
[1,] "10" "[]" "[[1,2]]" 
[2,] "20" "[]" "[[1,3]]" 

同樣

> x = rbind(c(10, "[]", "[[1,2]]"), c(20, "[]", "[[1,3]]")) 
> x 
    [,1] [,2] [,3]  
[1,] "10" "[]" "[[1,2]]" 
[2,] "20" "[]" "[[1,3]]" 

現在,我不想整數1020轉換爲字符串。 如何在沒有任何此類轉換的情況下執行此操作?當然我也想知道爲什麼會發生這種轉換。我看着 cbind的幫助,也嘗試了谷歌搜索,但沒有找到一個 解決方案的運氣。我也相信在某些情況下。 R將字符串轉換爲 因素,我也不希望這種情況發生,儘管在這裏似乎不會發生 。

+0

的問題是不與'cbind',但與'C'。這是您需要更好地理解的功能。 –

回答

28

向量和矩陣只能是單一類型,而向量中的cbind和將給出矩陣。在這些情況下,數字值將被提升爲字符值,因爲該類型將保存所有值。

(請注意,您rbind例如,促進發生在c調用內:

> c(10, "[]", "[[1,2]]") 
[1] "10"  "[]"  "[[1,2]]" 

如果你想有一個矩形結構,其中列可以是不同類型的,你想data.frame以下任何一種情況應該得到你想要的東西:

> x = data.frame(v1=c(10, 20), v2=c("[]", "[]"), v3=c("[[1,2]]","[[1,3]]")) 
> x 
    v1 v2  v3 
1 10 [] [[1,2]] 
2 20 [] [[1,3]] 
> str(x) 
'data.frame': 2 obs. of 3 variables: 
$ v1: num 10 20 
$ v2: Factor w/ 1 level "[]": 1 1 
$ v3: Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2 

或(使用專門的data.frame版本的cbind

> x = cbind.data.frame(c(10, 20), c("[]", "[]"), c("[[1,2]]","[[1,3]]")) 
> x 
    c(10, 20) c("[]", "[]") c("[[1,2]]", "[[1,3]]") 
1  10   []     [[1,2]] 
2  20   []     [[1,3]] 
> str(x) 
'data.frame': 2 obs. of 3 variables: 
$ c(10, 20)    : num 10 20 
$ c("[]", "[]")   : Factor w/ 1 level "[]": 1 1 
$ c("[[1,2]]", "[[1,3]]"): Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2 

或(使用cbind,但使第一一data.frame使得它結合作爲data.frames做):

> x = cbind(data.frame(c(10, 20)), c("[]", "[]"), c("[[1,2]]","[[1,3]]")) 
> x 
    c.10..20. c("[]", "[]") c("[[1,2]]", "[[1,3]]") 
1  10   []     [[1,2]] 
2  20   []     [[1,3]] 
> str(x) 
'data.frame': 2 obs. of 3 variables: 
$ c.10..20.    : num 10 20 
$ c("[]", "[]")   : Factor w/ 1 level "[]": 1 1 
$ c("[[1,2]]", "[[1,3]]"): Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2 
+0

感謝您的詳細解答。我不認爲我需要這些因素的屬性,我的回憶是他們可能會導致問題。有什麼方法可以用字符串值來創建數據框嗎? –

+0

將'stringsAsFactors = FALSE'添加到'data.frame'調用中。如果調用是隱式的(就像在最後一個例子中那樣),那麼你必須使它們顯式化:'data.frame(c(「[]」,「[]」),stringsAsFactors = FALSE)'。 –

+0

還有一個全局選項'stringsAsFactors'來控制它。我將其作爲發貨默認值並根據需要更改爲可重複性。 –

9

使用data.frame代替cbind應該是有幫助的

x <- data.frame(col1=c(10, 20), col2=c("[]", "[]"), col3=c("[[1,2]]","[[1,3]]")) 
x 
    col1 col2 col3 
1 10 [] [[1,2]] 
2 20 [] [[1,3]] 

sapply(x, class) # looking into x to see the class of each element 
    col1  col2  col3 
"numeric" "factor" "factor" 

正如你所看到的元素從COL1是numeric如你所願。

data.frame可以有不同的class的變量:numericfactorcharactermatrix不,一旦你把一個character元素爲矩陣中的所有其他將成爲這個類,不管他們是什麼CLASE之前。

+0

謝謝。我可以將'col2'和'col3'的類變成字符串嗎? –

+0

對不起,我很困惑我的意思是class'character'而不是'string'來查看R處理的類是什麼[this](http://stat.ethz.ch/R-manual/R-patched/library/methods/html /Classes.html),可以通過執行'as.character(factor)'來強制'factor'爲'character'。 –