2016-04-27 5 views
1

Ich habe ein Problem mit get() in R. mitzuweisen Wert zu einem R-Objekt ohne seinen Namen mit get() verwenden

Ich habe eine Reihe von data.frame s mit einer gemeinsamen Struktur in meiner Umgebung. Ich möchte diese Datenrahmen durchlaufen und den Namen der 2. Spalte so ändern, dass der Name der 2. Spalte ein Präfix aus der 1. Spalte enthält. Wenn z. B. Spalte 1 = A_cat und Spalte 2 dog ist, möchte ich Spalte 2 in A_dog ändern.

Unten ist ein Beispiel für den R-Code ich verwende:

df <- data.frame('A_cat'= 1:10 , 'dog' = 11:20) 

for(element in grep('^df$', names(environment()), value=TRUE)) { 

colnames(get(element))[2] <- paste(strsplit(colnames(get(element)) [1], '`_`')[[1]][1], 
           colnames(get(element))[2], sep='`_`') 

} 

Die Argumente in der for-Schleife, die auf beiden Seiten des Zuweisungsoperators, sowohl das erwartete Ergebnis, wenn ich sie separat laufen, aber wenn zusammen laufen lassen den folgenden Fehler erzeugen.

Fehler in COLNAMES (get (Element)) [2] < - Paste (strsplit (COLNAMES (get (Element)) [1],:
nicht Funktion finden konnten "get < -"

Jede mögliche Hilfe bei diesem Problem würde sehr geschätzt werden

+7

" Ich habe eine Reihe von Datenrahmen mit einer gemeinsamen Struktur in meiner Umgebung. " Warum sind sie nicht schön zusammen in einer Liste? Dann müsstest du überhaupt nicht "bekommen". – Roland

Antwort

1

Hier wäre ein Weg, dieses Ziel zu erreichen, wenn die data.frames systematische Namen haben (hier df1 df2 df3, usw.) und das Präfix endet mit „_“, wie im Beispiel:

# suggested by @roland roll them up in a list: 
myDfList <- mget(ls(pattern="^df")) 

# change names 
for(dfName in names(myDfList)) { 
    names(myDfList[[dfName]])[2] <- paste0(gsub("^(.*_)", "\\1", 
              names(myDfList[[dfName]])[1]), 
            names(myDfList[[dfName]])[2]) 
} 
3

Dies macht das gleiche wie der Code in der Frage ohne get mit:.

df <- data.frame('A_cat'= 1:10 , 'dog' = 11:20) 

e <- environment() ## 
df.names <- grep("^df$", names(e), value = TRUE) 

# nm is the current data frame name and nms are its column names 
for(nm in df.names) { 
    nms <- names(e[[nm]]) 
    names(e[[nm]])[2] <- paste0(sub("_.*", "_", nms[1]), nms[2]) 
} 

geben:

> df 
    A_cat A_dog 
1  1 11 
2  2 12 
3  3 13 
4  4 14 
5  5 15 
6  6 16 
7  7 17 
8  8 18 
9  9 19 
10 10 20 

die data.frames in einer benannten Liste zu halten, wie in einem Kommentar auf die Frage vorgeschlagen könnte noch besser sein. Zum Beispiel, wenn stattdessen die data.frames in einer Umgebung zu halten sie in einer Liste waren genannt e

e <- list(df = df) 

dann auslassen die Linie markiert ## und der Rest funktioniert wie.

Verwandte Themen