2016-08-11 5 views
0

Ich versuche einen R-Datenrahmen zu erstellen, in dem einige Spalten als Faktoren und andere als Strings behandelt werden.mix `stringsAsFactors` im Dataframe

fruits <- data.frame(fruit = character(), descr = character()) 
fruits <- rbind(fruits, data.frame(fruit = "apple", descr = "jjrkgnser")) 
fruits <- rbind(fruits, data.frame(fruit = "apple", descr = "aprtgh")) 
fruits <- rbind(fruits, data.frame(fruit = "pear", descr = "akjreg")) 

Hier werden beide Spalten als Faktoren behandelt, und ich am Ende für die descr Spalten mit so viele Faktoren auf, als es Zeilen in dem fruits Datenrahmen ist.

Wie kann descr als String behandelt werden, aber fruit als Faktoren? Wenn ich stringsAsFactors = FALSE verwende, gilt es für alle Spalten!

bearbeiten

gehackt ich diese Lösung nicht so elegant:

fruits <- data.frame(fruit = factor(), path = character(), stringsAsFactors = FALSE) 
fruits <- rbind(fruits, data.frame(fruit = factor("apple"), path = "jjrkgnser", stringsAsFactors = FALSE)) 
fruits <- rbind(fruits, data.frame(fruit = factor("apple"), path = "aprtgh", stringsAsFactors = FALSE)) 
fruits <- rbind(fruits, data.frame(fruit = factor("pear"), path = "akjreg", stringsAsFactors = FALSE)) 

Doing

> str(fruits) 
'data.frame': 3 obs. of 2 variables: 
$ fruit: Factor w/ 2 levels "apple","pear": 1 1 2 
$ path : chr "jjrkgnser" "aprtgh" "akjreg" 

die Anforderung passt. Gibt es eine nicer Weg?

+2

verwenden Befehle '' und as.factor' as.character', falls erforderlich, separat für jede Spalte. – AntoniosK

+2

Verwenden Sie 'rbind' als Teil eines Skripts? Warum nicht den gesamten Datensatz auf einmal erstellen? Etwas wie 'fruits <- data.frame (fruit = c (" Apfel "," Apfel "," Birne "), descr = I (c (" jjrkgnser "," aptgh "," akjreg "))). Ihr Code ist sowohl zu kompliziert als auch ineffizient, da er Objekte vergrößert, ohne vorher Speicher zuzuweisen. –

+0

@AntoniosK Würden Sie das als Antwort posten? Ich kann nicht herausfinden, wie. –

Antwort

1
# creating the dataset (no usage of rbind if possible) with factor columns by default 
fruits <- data.frame(fruit = c("apple", "apple", "pear"), 
        path = c("jjrkgnser", "aprtgh", "akjreg")) 

# transform this column to a character vector 
fruits$path = as.character(fruits$path) 
+0

Gut, danke! Und das funktioniert sogar mit meinem wachsenden Objekt. –

1

Ich bin mir nicht sicher, ob Sie rbind als anschauliches Beispiel oder als Anwendungsfall verwenden (es ist sehr ineffizient, Daten auf diese Weise zu erweitern), aber vorausgesetzt, dass es notwendig ist, können Sie Ihre Eingaben ein wenig erweitern parsimonious Verwendung data_frame vom tibble Paket (in dem dplyr et al. Paket Ökosystem)

library(tibble) 
fruits <- data_frame(fruit = factor(), descr = character()) 
fruits <- rbind(fruits, data_frame(fruit = factor("apple"), descr = "jjrkgnser")) 
fruits <- rbind(fruits, data_frame(fruit = factor("apple"), descr = "aprtgh")) 
fruits <- rbind(fruits, data_frame(fruit = factor("pear"), descr = "akjreg")) 
+0

Schöne Lösung, ich behalte das im Hinterkopf meine eigene Verwendung. Meine Produktionsumgebung hat dplyr 0.4.3 und liefert tibble noch nicht. Ich habe keine vollständige Kontrolle darüber und würde lieber Abhängigkeiten behalten. –