web-dev-qa-db-fra.com

Utilisation de lapply pour appliquer une fonction sur la liste des blocs de données et enregistrer la sortie dans des fichiers avec des noms différents

J'ai une liste de blocs de données et j'ai donné un nom à chaque élément de la liste (par exemple, chaque bloc de données):

par exemple.

df1 <- data.frame(x = c(1:5), y = c(11:15))  
df2 <- data.frame(x = c(1:5), y = c(11:15))  
mylist <- list(A = df1, B = df2)  

J'ai une fonction que je veux appliquer à chaque trame de données; Dans cette fonction, je veux inclure une ligne pour écrire les résultats dans un fichier (finalement, je veux faire des choses plus compliquées comme enregistrer les tracés de la corrélation entre deux variables pour chaque bloc de données, mais je pensais commencer simplement)

par exemple.

NewVar <- function(mydata, whichVar, i) {  
mydata$newVar <- mydata[, whichVar] + 1  
write.csv(mydata, file = i)  
}

Je souhaite utiliser lapply() pour appliquer cette fonction à chaque bloc de données de ma liste

quelque chose comme:

hh<-lapply(mylist, NewVar, whichVar = "y")

Je ne peux pas comprendre comment attribuer le "i" dans le contexte de lapply afin que i répète les noms dans la liste des trames de données, enregistrant plusieurs fichiers avec des noms différents (dans ce cas, deux fichiers nommés A et B) qui correspondent aux trames de données modifiées.

25
user2414840

Cela fonctionnera avec l'appel lapply suivant:

lapply(names(mylist), function(x) NewVar(mylist[[x]], "y", x))
9
Sven Hohenstein

Il existe de nombreuses options. Par exemple:

  lapply(names(mylist),
         function(x)write.csv(mylist[x],
                              file =paste0(x,'.csv')))

ou en utilisant des index:

 lapply(seq_along(mylist),
     function(i)write.csv(mylist[i],
                          file =paste0(names(mylist)[i],'.csv')))
12
agstudy