2016-06-14 10 views
0

ich versuche, ein Problem aus einer Frage zu lösen, ich vorher looping inside list in rVerwendung Name Datenrahmen auf einer Liste von Datenrahmen

geschrieben habe, ist es eine Möglichkeit, den Namen eines Datenrahmen zu erhalten, die auf einer Liste von Datenrahmen ist? Ich habe eine Reihe von Datenrahmen aufgelistet und zu jedem Datenrahmen, den ich anwenden möchte myfunction. Aber ich weiß nicht, wie man den Namen jedes Datenrahmens erhält, um ihn auf nameofprocesseddf von myfunction zu verwenden.

Hier ist die Art, wie ich die Liste meiner Datenframes und den Code, den ich bis jetzt bekommen habe. Irgendwelche Vorschläge, wie ich das schaffen kann?

library(missForest) 
library(dplyr) 

myfunction <- function (originaldf, proceseddf, nonproceseddf, nameofprocesseddf=character){ 
NRMSE <- nrmse(proceseddf, nonproceseddf, originaldf) 
comment(nameofprocesseddf) <- nameofprocesseddf 
results <- as.data.frame(list(comment(nameofprocesseddf), NRMSE)) 
names(results) <- c("Dataset", "NRMSE") 
return(results) 
} 
a <- data.frame(value = rnorm(100), cat = c(rep(1,50), rep(2,50))) 
da1 <- data.frame(value = rnorm(100,4), cat2 = c(rep(2,50), rep(3,50))) 

dataframes <- dir(pattern = ".txt") 
list_dataframes <- llply(dataframes, read.table, header = T, dec=".", sep=",") 
n <- length(dataframes) 

# Here is where I do not know how to get the name of the `i` dataframe 
for (i in 1:n){ 
modified_list <- llply(list_dataframes, myfunction, originaldf = a, nonproceseddf = da1, proceseddf = list_dataframes[i], nameof processeddf= names(list_dataframes[i])) 
write.table(file = sprintf("myfile/%s_NRMSE20%02d.txt", dataframes[i]), modified_list[[i]], row.names = F, sep=",") 
} 
+0

Versuch '' 'Namen (list_dataframes) [i] '' '- aber wo wird der Name vergeben? –

+0

das ist genau mein Problem, ich weiß nicht, wie man den Namen jedes in der Liste enthaltenen Datenrahmens zuweist. Irgendeine Idee, wie ich es zuordnen kann? – mina

+0

'llply' kommt von plyr, nicht dplyr. Ich denke, Sie werden feststellen, dass Ihre Objektnamen mehr Probleme haben, als sie wert sind. (Ich beziehe mich auf 'nonproceseddf', das einen Rechtschreibfehler enthält, et al. Nicht den Inhalt der Frage. Kürzere Namen sind im Allgemeinen besser.) – Frank

Antwort

1

als eine Tatsache, die Name eines Datenrahmens ist kein Attribut des Datenrahmens. Es ist nur ein Ausdruck, um das Objekt aufzurufen. Daher ist der Name des Datenrahmens tatsächlich 'list_dataframes [i]'.

Da ich nehme an, Sie möchten, dass Ihre Datenrahmen nennen wie die Textdatei ohne die Erweiterung genannt wird, schlage ich vor, Sie verwenden so etwas wie (es die Bibliothek stringr erforderlich):

nameofprocesseddf = substr(dataframes[i],start = 1,stop = str_length(dataframes[i])-4) 
+0

Gibt es einen Vorteil zu stringr :: str_length über nchar hier? – Frank

+1

@Frank nicht wirklich auf normalen String. aber bei einigen UTF-8-Strings könnte es anders sein. [nchar] (https://stat.ethz.ch/R-manual/R-devel/library/base/html/nchar.html) –