2016-12-08 4 views
0

Ich lerne R und war auf der Suche nach einer Möglichkeit, dieselbe Datentransformation über mehrere Datenrahmen hinweg vorzunehmen, z. B. eine Variable, die in jedem Datenrahmen erscheint, neu zu codieren, ohne den Code jedes Mal für jeden Datenrahmen eingeben zu müssen. Ich habe eine Liste der Datenframes erstellt und dann mit lapply() alle in einer Funktion transformiert, das Ergebnis wurde jedoch in einer neuen Liste gespeichert. Ich möchte jetzt jedes dieser Listenelemente in seine eigenen Datenfelder extrahieren können, die genauso benannt werden wie die Originale. Weiß jemand, wie man das macht? HierExtrahieren einzelner Datenframes aus einer Liste nach Transformationen (lapply)?

ist einige Beispiel-Code:

testlist<-list(FY2012First,FY2012Last) 

testlist<-lapply(testlist, function(q) { 
     q<-mutate(q, 
      YearsofServiceCat = 
       ifelse(YearsatAgency<=2, "0-2", 
       ifelse(YearsatAgency>=3 & YearsatAgency<=5,"3-5", 
       ifelse(YearsatAgency>=6 & YearsatAgency<=8,"6-8", 
       ifelse(YearsatAgency>=9,"9 or greater", 
        "Unknown"))))))} 

Das gibt mir eine neue Liste mit jedem Element aktualisiert, wie ich will, aber jetzt möchte ich diese Elemente wieder in einzelne Datenrahmen bekommen Namen „FY2012First“ und „FY2012Last ". Ich habe diese es einzeln zu tun:

FY2012FirstNew<-as.data.frame(list["FY2012First"]) 

jedoch in FY2012FirstNew jede Variable wird jetzt unter dem Namen „FY2012First (Variablenname)“, und ich möchte nicht, dass, sollten sie nur „genannt werden (variable Name)."

Also die Frage ist wirklich zweifach; Gibt es eine bessere Möglichkeit, diese Datenrahmen zu extrahieren, und gibt es eine Möglichkeit, dies ohne die Umbenennung von Variablen zu tun?

+1

Sie betrachten könnte ein minimales Beispiel das Hinzufügen, sagen etwas in der Größenordnung von 'Liste (a = list (1: 2), b = Liste (4: 5)) '. Wahrscheinlich sollten Bibliotheksaufrufe enthalten sein, die zum Laden der Hadleyverse-Funktionen benötigt werden. –

+0

Sie können die 'ifelse' Anweisungen wahrscheinlich mit' cut' loswerden. z.B. 'muate (YearsOfServiceCat = cut (YearsAgency, c (0, 3, 6, 9, 100), c (" 0-2 "," 3-5 "," 6-8 "," 9 + "))) –

+0

Wow, ich wusste nicht einmal über die Schnittfunktion, das macht die Dinge viel einfacher, danke! – maccorf

Antwort

0

Es gibt wahrscheinlich einen besseren Weg, aber ich würde für Schleife verwenden:

for (i in 1:length(testlist)) { 
    assign(names(testlist)[i], testlist[[i]]) 
} 
1
data(iris) 
data(mtcars) 
iris2 = iris 
mtcars2 = mtcars 
testlist = list(iris2 = iris, mtcars2 = mtcars) 

testlist = lapply(testlist, function(dfs){ 
    dfs$new_col = 1 
    dfs 
}) 

# datasets are unchanged 
str(iris2) 
str(mtcars2) 
rm(list = names(testlist)) 
list2env(testlist, baseenv()) 
# datasets are updated 
str(iris2) 
str(mtcars2) 
+0

Nicht sicher, was das tut, habe ich kein Ergebnis daraus :( – maccorf

+0

@ maccorf Es scheint, dass 'list2env' überschreibt keine vorhandenen Variablen. Siehe Update mit reproduzierbaren Beispiel. –

Verwandte Themen