2015-02-21 19 views
10

Ziel: Ändern Sie die Spaltennamen aller Datenrahmen in der Globalen Umwelt aus der folgenden ListeÄndern der Spaltennamen in einer Liste von Datenrahmen in R

COLNAMES von denen in der globalen Umwelt

Damit.

0) Die Spaltennamen sind:

colnames = c("USAF","WBAN","YR--MODAHRMN") 

1) Ich habe folgende data.frames: DF1, DF2.

2) ich sie in eine Liste gesetzt:

dfList <- list(df1,df2) 

3) Schleife durch die Liste:

for (df in dfList){ 
    colnames(df)=colnames 
} 

Aber das schafft eine neue df mit den Spaltennamen, die ich brauche, es doesn Ändern Sie nicht die ursprünglichen Spaltennamen in df1, df2. Warum? Könnte es eine Lösung sein? Dank

Kann so etwas wie:

lapply(dfList, function(x) {colnames(dfList)=colnames}) 

Arbeit?

Antwort

15

Mit lapply können Sie es wie folgt tun.

erstellen Beispieldaten:

df1 <- data.frame(A = 1, B = 2, C = 3) 
df2 <- data.frame(X = 1, Y = 2, Z = 3) 
dfList <- list(df1,df2) 
colnames <- c("USAF","WBAN","YR--MODAHRMN") 

Dann lapply über die Liste mit setNames und liefern den Vektor der neuen Spaltennamen als zweites Argument an setNames:

lapply(dfList, setNames, colnames) 
#[[1]] 
# USAF WBAN YR--MODAHRMN 
#1 1 2   3 
# 
#[[2]] 
# USAF WBAN YR--MODAHRMN 
#1 1 2   3 

bearbeiten

Wenn Sie die Daten zuweisen möchten.Frames zurück in die globale Umwelt, können Sie den Code wie folgt ändern:

dfList <- list(df1 = df1, df2 = df2) 
list2env(lapply(dfList, setNames, colnames), .GlobalEnv) 
+0

Aber dann .... colnames (df2) gibt Ihnen das Original: [1] "X" "Y" "Z" – Oniropolo

+0

@Oniropolo, siehe meine Bearbeitung. Dies wird Ihre ursprünglichen data.frames in der globalen Umgebung ändern –

+0

Dies ist viel zu weit fortgeschritten für meine R-Kenntnisse, aber ich las auf Umgebungen. Kann ich Sie fragen, warum 1) Sie keine neue Umgebung anstelle einer Liste erstellt haben? 2) Angenommen, Sie müssen einige Daten bereinigen, z. B. strptime (df1 $ YR - MODAHRMN, Format = '% Y% m% d% H% M'). Wäre es möglich, eine Umgebung zu erstellen und dann alle Elemente in dieser neuen Umgebung zu ändern? Entschuldigung für den Mangel an Wissen! – Oniropolo

0

Wenn Sie möchten, dass die for-Schleife funktioniert, sollten Sie nicht das gesamte data.frame als Argument übergeben.

for (df in 1:length(dfList)) 
    colnames(dfList[[df]]) <- colnames 
+0

ich es nicht wirklich bekommen ... So zum Beispiel das Beispiel die erste Person gab, mit Ihrem Code verwenden, habe ich noch COLNAMES bekommen (df2) ... [1] "X" "Y" "Z" – Oniropolo

+0

In dieser Antwort sprechen Sie, df2 ist ein 'dat.frame', das nichts mit dfList zu tun hat, was eine Kombination aus df1 und df2 ist. Also werden die Namen in der df2 geändert, die in der dfList vorhanden ist. Betrachten Sie 'colnames (dfList $ df2)' für geänderte Spaltennamen. – StrikeR

4

einfach Ihre ändern for-Schleife in einen Index for-Schleife wie folgt aus:

Daten

df1 <- data.frame(a=runif(5), b=runif(5), c=runif(5)) 
df2 <- data.frame(a=runif(5), b=runif(5), c=runif(5)) 

dflist <- list(df1,df2) 

colnames = c("USAF","WBAN","YR--MODAHRMN") 

Lösung

for (i in seq_along(dflist)){ 
    colnames(dflist[[i]]) <- colnames 
} 

Ausgabe

> dflist 
[[1]] 
     USAF  WBAN YR--MODAHRMN 
1 0.8794153 0.7025747 0.2136040 
2 0.8805788 0.8253530 0.5467952 
3 0.1719539 0.5303908 0.5965716 
4 0.9682567 0.5137464 0.4038919 
5 0.3172674 0.1403439 0.1539121 

[[2]] 
     USAF  WBAN YR--MODAHRMN 
1 0.20558383 0.62651334 0.4365940 
2 0.43330717 0.85807280 0.2509677 
3 0.32614750 0.70782919 0.6319263 
4 0.02957656 0.46523151 0.2087086 
5 0.58757198 0.09633181 0.6941896 

Mit for (df in dfList) erstellen Sie im Wesentlichen ein neues df jedes Mal und ändern die Spaltennamen so, dass die ursprüngliche Liste (dfList) unverändert bleibt.

+0

Warum gibt dann ...> Spaltennamen (df2) das Original zurück [1] "a" "b" "c"? – Oniropolo

+0

Da sich die data.frames, die sich ändern, nicht in der Liste, sondern in der Liste befinden. Wenn du 'colnames (df2)' tust, erhältst du die ursprünglichen Namen, weil df2 nichts passiert ist. Tun Sie stattdessen 'colnames (dflist [[2]])' ', um das Ergebnis zu sehen. 'df2' ist das zweite Element in der Liste und das hat sich geändert. Sie können 'df2 <- dflist [[2]]' wenn Sie danach wollen. – LyzandeR

+0

Die Frage ist dann, wie man das ursprüngliche df2 ändert? Die wichtigsten Spalten sind das Original df1, df2; Die Liste ist nur eine Möglichkeit, beide in einer Schleife zu ändern. – Oniropolo

Verwandte Themen