2012-10-08 10 views
23

Betrachten Sie den folgenden R-Code.Erstellen eines Datenrahmens aus zwei Vektoren mit cbind

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

Ähnlich

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

Nun, ich will nicht die ganzen Zahlen 10 und 20 in Strings konvertiert werden. Wie kann ich diesen Vorgang ohne eine solche Konvertierung durchführen? Ich würde gerne von natürlich auch wissen, warum diese Umstellung passiert. Ich schaute auf die cbind Hilfe und versuchte auch Googeln, aber hatte kein Glück, eine Lösung zu finden. Ich glaube auch, dass in einigen Fällen. R konvertiert Zeichenfolgen in Faktoren, und ich möchte nicht, dass dies auch passiert, obwohl es nicht scheint, dass hier passiert.

+0

Das Problem ist nicht mit 'cbind', aber mit 'c'. Das ist die Funktion, die Sie besser verstehen müssen. –

Antwort

28

Vektoren und Matrizen können nur von einem einzigen Typ sein und cbind und rbind auf Vektoren ergeben Matrizen. In diesen Fällen werden die numerischen Werte in Zeichenwerte umgewandelt, da dieser Typ alle Werte enthält.

(Beachten Sie, dass in Ihrem rbind Beispiel die Förderung innerhalb des c Aufruf geschieht.

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

Wenn Sie eine rechteckige Struktur wollen, wo die Säulen unterschiedlicher Art sein können, möchten Sie eine data.frame Jede der folgenden bekommen sollten Sie, was Sie wollen:

> 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 

oder (unter Verwendung von speziell auf die data.frame Version von 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 

oder (mit cbind, sondern macht die erste eine data.frame, so dass sie kombiniert als data.frames tun):

> 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

Danke für die ausführliche Antwort. Ich glaube nicht, dass ich die Eigenschaften von Faktoren hier brauche, und meine Erinnerung ist, dass sie Probleme verursachen können. Gibt es eine Möglichkeit, einen Datenrahmen mit String-Werten zu erstellen? –

+0

Fügen Sie 'stringsAsFactors = FALSE' den' data.frame' Aufrufen hinzu.Wenn die Aufrufe implizit sind (wie im letzten Beispiel), müssen Sie sie explizit machen: 'data.frame (c (" [] "," [] "), stringsAsFactors = FALSE)'. –

+0

Es gibt auch eine globale Option 'stringsAsFactors', die dies steuert. Ich belasse es als den Standardversand und ändere es je nach Bedarf für die Reproduzierbarkeit. –

9

Mit data.frame statt cbind sollte

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" 

hilfreich sein, wie Sie Elemente sehen können, von col1 numeric sind, wie Sie wollen.

data.frame können Variablen verschiedener class haben: numeric, factor und character aber matrix nicht, wenn Sie eine character Element in eine Matrix setzen alle anderen in dieser Klasse werden wird, egal was clase sie vorher waren.

+0

Danke. Kann ich die Klasse von 'col2' und' col3' in string umwandeln? –

+0

Sorry, ich war verwirrt, ich meinte die Klasse 'character' anstelle von' string', um zu sehen, welche Klassen R handle, siehe [this] (http://stat.ethz.ch/R-manual/R-patched/library/methods/html /Classes.html), können Sie 'factor' durch' as.character (factor) 'zu' character' machen. –

Verwandte Themen