2016-06-22 9 views
4

Zum BeispielWie kann ich die Konvertierung von Zeichen in Faktoren stoppen?

chr <- c("a", "b", "c") 
intgr <- c(1, 2, 3) 
str(chr) 
str(base::merge(chr,intgr, stringsAsFactors = FALSE)) 

gibt:

> str(base::merge(chr,intgr, stringsAsFactors = FALSE)) 
'data.frame': 9 obs. of 2 variables: 
$ x: Factor w/ 3 levels "a","b","c": 1 2 3 1 2 3 1 2 3 
$ y: num 1 1 1 2 2 2 3 3 3 

ich ursprünglich dachte, es etwas mit dem zu tun hat, wie merge Argumente in Datenrahmen nötigt. Ich dachte jedoch, dass das Hinzufügen des Arguments stringsAsFactors = FALSE das Standard-Zwangsverhalten von char -> factor außer Kraft setzen würde, aber das funktioniert nicht.

EDIT: Sie folgendermaßen vorgehen gibt mir erwartetes Verhalten:

options(stringsAsFactors = FALSE) 
str(base::merge(chr,intgr)) 

das ist:

> str(base::merge(chr,intgr)) 
'data.frame': 9 obs. of 2 variables: 
$ x: chr "a" "b" "c" "a" ... 
$ y: num 1 1 1 2 2 2 3 3 3 

aber das ist nicht ideal, da sie die globale stringsAsFactors Einstellung ändern.

+0

Was bedeutet 'Klasse (chr)' und 'Klasse (intgr)' Sie zeigen? Ich habe 'stringsAsFactors' noch nie mit' merge() 'verwendet. –

+0

'> Klasse (chr) [1]" Zeichen "' und '> Klasse (intgr) [1]" numeric' – Alex

+0

Ich sah, dass Link @ Hack-R aber es gilt hier nicht: im Fall referenziert die Person verbindet zwei Datenrahmen 'x, y' mit einem gemeinsamen Spaltennamen, außer einer ist ein Faktor und der andere ein Zeichen. Hier mache ich das Kreuzprodukt. – Alex

Antwort

2

Sie können diese bestimmte "merge" mit expand.grid() erreichen, da Sie wirklich nur das kartesische Produkt nehmen. Auf diese Weise können Sie das stringsAsFactors Argument übergeben:

sapply(expand.grid(x=chr,y=intgr,stringsAsFactors=F),class); 
##   x   y 
## "character" "numeric" 

Hier ist ein Weg, um diese Einschränkung von merge() Arbeits:

sapply(merge(data.frame(x=chr,stringsAsFactors=F),intgr),class); 
##   x   y 
## "character" "numeric" 

Ich würde behaupten, dass es nie Sinn macht, eine Atomvektor passieren zu merge(), da es nur wirklich zum Zusammenführen von data.frames konzipiert ist.

1

Wir CJ von data.table als welll verwenden

library(data.table) 
str(CJ(chr, intgr)) 
Classes ‘data.table’ and 'data.frame': 9 obs. of 2 variables: 
#$ V1: chr "a" "a" "a" "b" ... 
#$ V2: num 1 2 3 1 2 3 1 2 3 
+0

das ist ziemlich gut, 'CJ' schneller als' merge' oder 'expand.grid'? Das andere Problem mit 'merge' ist, wie lange es dauert. – Alex

+0

@Alex Basierend auf [hier] (http://stackoverflow.com/questions/12948686/why-is-expand-grid-faster-than-data-table-s-cj) scheint CJ schneller zu sein – akrun

Verwandte Themen