2016-11-21 10 views
0

Ich bin eine Reihe von Dateien erstellen. Ich habe eine Liste mit zwei Buchstaben. Jede Datei enthält eine Spalte mit demselben Namen wie die Datei. Ich mache ihnen eine Reihe von Dingen, indem ich sowohl die Datei als auch die Spalte mit dem Namen identifiziere, der in einer Variablen, sT, enthalten ist. Zum Beispiel habe ich eine Datei namens OH, und sT enthält "OH".R: Mit dplyr entfernen Sie eine Spalte in einer Zeichenfolge in einer Variablen,

Die letzte Sache, die ich mit der Datei machen möchte, ist die gleichnamige Spalte zu entfernen und eine Datei mit dem gleichen Namen zurückgeben. Ich versuche, fließend zu werden ordentlich, Sprache der Ordyverse, also versuche ich, dies mit Auswahl zu tun.

OH <- data.frame(X=1:2, OH=3:4) 

Ich denke, das unter Nicht-Standard-Auswertung funktionieren sollte:

assign(sT, select(get(eval(sT)), -as.symbol(get(sT))) 

wo sT "OH" und erhalten (eval (sT)) OH ist die Datei. Und ich denke, eine davon sollte funktionieren, unter Standardauswertung:

assign(sT, select(get(eval(sT)), - sT)) 

oder

assign(sT, select_(get(eval(sT)), paste0("-", sT))) 

je nachdem, ob select_ das Minuszeichen innerhalb der Zeichenfolge akzeptieren. Aber keiner von ihnen tun, Rückkehr jeweils:

Error in -as.symbol(sT) : invalid argument to unary operator 

Error in eval(expr, envir, enclos) : object 'OH' not found 

Error in eval(expr, envir, enclos) : object 'OH' not found 
+0

Sie benötigen die SE-Version verwenden: 'get (sT)%>% SELECT_ (Paste ('-', sT)) 'All die' assign' und 'eval' lassen mich denken, dass es einen besseren Weg gibt, sich deinem größeren Ziel zu nähern. – alistaire

+0

Oder mit Zuweisung, 'assign (sT, get (sT)%>% select_ (einfügen ('-', sT)))) (Zuweisung scheint nicht gut zu pipettieren). – alistaire

+2

Ich denke, dass dies für eine benannte "Liste" mit jedem Ihrer Datensätze schreien, aber ich bin mir nicht sicher, was genau Ihr größeres Ziel ist. Es gibt nichts "Ordentliches", wenn man 'get'' assign' usw. auf freischwebenden 'data.frames' verwendet und dann eine ganz andere Komplexitätsebene hinzufügt, indem man es durch eine Pipe führt. Ich habe die Besorgnis von @alistaire zum Ausdruck gebracht, dass Sie diese Strategie wahrscheinlich überhaupt nicht anwenden sollten. – thelatemail

Antwort

1

Sie benötigen matches

assign(sT, select(get(eval(sT)), -matches(sT))) 

bearbeiten verwenden: als alistaire darauf hinweist, sollte es wie unten sein, falls es gibt auch andere Spalten, deren Namen OH

assign(sT,select(get(eval(sT)), -matches(paste0('^', sT, '$')))) 

Doing es als unten ist wahrscheinlich lesbarer. Es ist auch schneller.

assign(sT, OH[which(names(OH) != sT)]) 

Wenn Sie es als eine Funktion lapply wollen hier ist ein

removecol <- function(string, data = F){ 
    if(class(data) == 'logical') data <- get(eval(sT)) 
    assign(sT, data[which(names(data) != sT)], envir = .GlobalEnv) 
} 

OH 
# X OH 
#1 1 3 
#2 2 4 
removecol(sT) 
OH 
# X 
#1 1 
#2 2 
+0

Wenn Sie ähnlich benannte Variablen haben, müssen Sie möglicherweise angeben, dass der ganze Name mit 'matches (paste0 ('^', sT, '$'))' – alistaire

+0

Danke Jim! Das hat den Job gemacht. Eine Sache, die mich fasziniert, ist zu sehen, wie besser R-Programmierer (d. H. Die meisten R-Programmierer) Code schreiben, der kürzer, sauberer und abstrakter ist als meiner. Ich finde diesen Code oft noch schwer zu verstehen, aber ich komme dorthin. Wie die Gaciers ist mein Fortschritt langsam, aber unerbittlich! Zumindest hoffe ich, dass ich es nicht übertreiben werde. Dies war das letzte fehlende Bit für 1 Zustand - jetzt werde ich sehen, ob RStudio meine 6 Seiten von Hintern-hässlichem Code in 1 Funktion verwandeln kann, die ich einfach mit 18 2-Buchstaben-Zustandscode & handle aus 18 animierten Karten. Daumen drücken. – andrewH

Verwandte Themen