2016-05-16 2 views
2

Ich habe mehrere Datenrahmen mit einigen Spalten mit den gleichen Namen. Ich versuche einen Weg zu finden, das Format der gleichnamigen Spalten aus verschiedenen Datenrahmen systematisch zu ändern. Hier ist, was ich habe kommen mit:Wie kann ich das Format von Spalten aus mehreren Datenrahmen konvertieren?

data1=data.frame(a=seq(1:10),b=c("a","b")) 
data2=data.frame(a=seq(11:20),b=c("c","d")) 

temp = c("data1$a","data2$a") 

for (i in 1:length(temp)) { 
    eval(parse(text=(temp)[i])) = as.character(eval(parse(text=(temp)[i]))) 
} 

Nachdem der Code ausgeführt wird, habe ich die folgende Nachricht erhalten:

Error in file(filename, "r") : cannot open the connection 
In addition: Warning message: 
In file(filename, "r") : 
    cannot open file 'data1$a': No such file or directory 

Allerdings, wenn ich den folgenden Code ausführen, funktioniert es:

as.character(eval(parse(text=(temp)[1]))) 

Kann jemand bitte helfen, meinen Code zu korrigieren und zu erklären, warum es nicht funktioniert?

+0

Auch bezüglich des Fehlers, den Sie mit Ihrem parse/eval-Versuch bekommen, weiß ich nicht genau, was passiert, aber es scheint mit dem '* tmp *' Artefakt von R's Umsetzung komplexer lvalues ​​verwandt zu sein, dh Lvalues, die aus indizierten Objekten oder Funktionsaufrufen bestehen. Ich weiß nicht genug über die R-Interna, um genauer zu sein, aber diese Implementations-Verrücktheit sah immer wie ein Hack für mich aus, und dieser Fehler, den Sie bekommen, sieht wie ein obskurer Fehler im Hack aus. Siehe https://cran.r-project.org/doc/manuals/r-release/R-lang.html#Subset-assignment für einige Informationen über '* tmp *'. – bgoldst

+0

Wenn Sie 'traceback()' sofort nach dem Auftreten des Fehlers ausführen, können Sie sehen, dass '* tmp *' etwas faul macht. Es wird schließlich als unbenanntes Argument an 'parse()' übergeben, das als Dateiname interpretiert wird, der dann nicht geöffnet werden kann. – bgoldst

Antwort

3

Es sieht für mich aus, als würden Sie "Getrenntheit" und "Systematik" der Datenverarbeitung mischen. Mit anderen Worten, Sie versuchen, mehrere Datenobjekte in der globalen Umgebung getrennt zu speichern, aber auch systematisch mit ihnen zu arbeiten. Ich würde vorschlagen, dass dies ein Fehler ist. Sie sollten einen Ansatz für die Datenverarbeitung wählen und dabei bleiben.

1: Getrennt

Das ist einfach. Speichern Sie die data.frames getrennt (das ist genau das, was Sie tun), und ändern Sie sie getrennt:

data1 <- data.frame(a=seq(1:10),b=c('a','b')); 
data2 <- data.frame(a=seq(11:20),b=c('c','d')); 

data1$a <- as.character(data1$a); 
data2$a <- as.character(data2$a); 

2: Systematicness

Dieses erfordert in einer Liste, die die Speicherung von Daten aus der Anfang. Das kann die Ausführlichkeit einiger Codes leicht erhöhen, da Sie die Liste dere dereferenzieren müssen, um auf die einzelnen data.frames zuzugreifen, aber es erleichtert die systematische Datenverarbeitung, nach der Sie suchen, die viel doppelten Code beseitigen kann:

data <- list(
    data.frame(a=seq(1:10),b=c('a','b')), 
    data.frame(a=seq(11:20),b=c('c','d')) 
); 

for (i in seq_along(data)) data[[i]]$a <- as.character(data[[i]]$a); 

Wie Sie jeder dieser Ansätze sehen verringert die Notwendigkeit chaotisch Parse/eval Lösungen zu verwenden. Normalerweise sollte diese Art der dynamischen Codegenerierung, Analyse und Auswertung nicht notwendig sein.

2

Wir können die Datensätze in einem list (mget(ls(patterns = "data\\d+"))) platzieren, Schleife über die list und die Spalte von Interesse („col_of_interest“) zu character Klasse konvertieren. Um die Änderung im ursprünglichen Objekt widerzuspiegeln, verwenden wir list2env (aber ich würde empfehlen, mit list statt einzelner Objekte zu arbeiten).

col_of_interest <- "a" 
list2env(lapply(mget(ls(pattern = "data\\d+")), 
     function(x) {x[[col_of_interest]] <- as.character(x[[col_of_interest]]) 
        x}), envir = .GlobalEnv) 
str(data1) 
#'data.frame': 10 obs. of 2 variables: 
#$ a: chr "1" "2" "3" "4" ... 
#$ b: Factor w/ 2 levels "a","b": 1 2 1 2 1 2 1 2 1 2 

HINWEIS: Die Idee, die Datensätze in einem list platzieren und zu character für ausgewählte Spalten Umwandlung bereits in diesem Beitrag beschrieben.

+1

Hi @akrun, die von Ihnen bereitgestellte Lösung funktioniert wunderbar. Ich habe Ihre Antwort aufgefrischt, aber ich habe sie nicht als endgültige Antwort akzeptiert. Der Grund ist, dass bgoldsts Antwort erleuchtender ist, da sie mir hilft, den Unterschied zwischen Getrenntheit und Systematik zu verstehen, und dies ist ein fundamentaleres Thema für mich. Ich würde gerne beide Antworten akzeptieren, wenn der Stacking-Flow dies zulässt. – Cypress

+0

@Cypress Vielen Dank für die Notiz. Es ist in Ordnung, und ja, seine Antwort ist umfassender und enthält die Jargons – akrun

Verwandte Themen