2017-03-07 4 views
0

Angenommen, ich habe mehrere Daten und möchte sie jeweils unterteilen.Objekt nicht gefunden Fehler beim Subsetting mit r

n = c(1, 1, 1) 
s = c(55, 56, 57) 
q = c(99, 100, 101) 
df_1 = data.frame(n, s, q) 
df_2 = data.frame(n, s, q) 
df_3 = data.frame(n, s, q) # assume they are the same. 

    n s q 
1 1 55 99 
2 1 56 100 
3 1 57 101 

Dann erstelle ich eine Schleife um die Datei zu nennen,

for (h in 1:3){ # for loop the file 
    for (i in 1:1){ # i is for different values in column 'n' 

    Result <- paste('ResultFile_',h,sep="") 
    input <- paste('df_',h,sep="") 

    Result <- subset(input,subset=n==i)[,c(2,3)] 

DO SOMETHING HERE.... 

} 
} 

Ich gehe davon aus, dass, wenn Spalte ‚n‘ gleich 1 ist, werde ich Spalte S erhalten und Q. Es 3 Ergebnisdateien erzeugen wird mir.

Aber es kommt mit Fehlermeldung.

Error in subset.default(input, subset = n == i) : object 'n' not found 

Als ich 'Input' als 'DF1' in dieser Zeile subset(input,subset=n==i)[,c(2,3)], dann kann es funktionieren direkt ersetzen.

Warum ??

+3

In Ihrem Beispiel ist 'input' eine Zeichenkette, die Sie mit' paste() 'erstellen (mit' class (input) 'überprüfen). 'subset' muss Sie in einem data.frame übergeben. Wenn Sie eine Reihe von Variablen namens 'df_1',' df_2', 'df_3' haben, ist das normalerweise ein Zeichen, dass Sie in R" falsch liegen ". Ihre data.frames sollten in einer Liste sein, um dies zu erleichtern. Siehe diese Frage für bessere Lösungen: http://stackoverflow.com/questions/17499013/how-do-i-make-a-list-of-data-frames – MrFlick

Antwort

2

Es ist möglich, die get Funktion zu verwenden, um Ihre Zeichenfolge zu übergeben, um das Objekt aufzurufen. Sie können so etwas wie dies versuchen:

input <- get(paste("df_", h, sep = "")) 

Jetzt input die gleiche Datenrahmen wie df_1 ist, kein String "df_1".

Übrigens, wenn Sie eine Funktion über mehrere Datenrahmen anwenden möchten, können Sie eine Liste aller Datenrahmen erstellen und dann lapply verwenden, um die Funktion anzuwenden. Wenn Sie beispielsweise alle Datenrahmen unterteilen möchten, wenn s == 56.

data_list <- list(df_1, df_2, df_3) 
data_list2 <- lapply(data_list, subset, subset = s == 56) 

Alle resultierenden Datenrahmen werden nun in data_list2 gespeichert.

+0

Danke für die "get" -Methode, es funktioniert gut, @ ycw, aber wie wäre es mit dem Erstellen mehrerer 'ResultFile_' Datei gleichzeitig? (In meinem Fall sind 3 Ergebnisdateien). – BigSecrect

+1

Sie können 'mget' verwenden, um mehrere Datensätze in einer' liste' zu ​​erstellen. – akrun

+1

@BigSecrect, Sie können die 'assign' Funktion versuchen. Zum Beispiel, nachdem der 'Result'-Datenrahmen mit 'subset' erzeugt wurde, fügen Sie den folgenden Code' assign (paste (' ResultFile_ ', h, sep = ""), Result) 'hinzu. – www

Verwandte Themen