2017-03-12 2 views
0

J'essaie d'écrire une sorte de fonction de boucle qui me permettra d'appliquer le même ensemble de code à des dizaines de trames de données qui sont stockées dans une liste. Chaque trame de données a le même nombre de colonnes et d'en-têtes identiques pour chaque colonne, bien que le nombre de lignes varie d'une trame de données à l'autre.Modifier les données stockées dans une liste

Ces données proviennent d'une étude de réseau social égocentrique où j'ai recueilli des données de réseau ego dans le format edgelist de dizaines de répondants différents. Le logiciel de collecte de données que j'utilise stocke les données de chaque interview dans son propre fichier .csv. Voici une image des données brutes pour une trame de données spécifique (image of raw data). Pour mes besoins, j'ai seulement besoin d'utiliser les données des quatrième, sixième et septième colonnes. En outre, j'ai seulement besoin de lignes de données où la dernière colonne a des valeurs de 4, à quel point la dernière colonne peut être entièrement supprimée. Le résultat final est un cadre de données à deux colonnes qui représente les relations entre des paires de personnes.

Après la lecture des données et le stocker sous forme d'un objet, je courus le code suivant:

x100291 = `100291AlterPair.csv`  #new object based on raw data 
foc.altername = x100291$Alter.1.Name 
altername = x100291$Alter.2.Name  
tievalue = x100291$AlterPair_B   
tie = tievalue       
tie[(tie<4)] = NA      
egonet.name = data.frame(foc.altername, altername, tievalue) 
depleted.name = cbind(tie,egonet.name) 
depleted.name = depleted.name[is.na(depleted.name[,1]) == F,] 
dep.ego.name = data.frame(depleted.name$foc.altername, depleted.name$altername) 

Ceci a produit la trame de données suivante (image of final data). C'est finalement ce que je veux. Maintenant, je sais que je pourrais couper et coller ce même jeu de code 100 fois et modifier manuellement les noms de fichiers, mais je préférerais ne pas le faire. Au lieu de cela, j'ai stocké tous mes fichiers .csv bruts comme des trames de données dans une seule liste. Je suspecte que je peux appliquer le même code à travers tous les cadres de données en utilisant l'une des commandes apply, mais je ne peux pas le comprendre.

Est-ce que quelqu'un a des suggestions sur la façon dont je pourrais appliquer ce code de base à une liste de trames de données pour que je finisse avec une nouvelle liste contenant les versions nettoyées et réduites des données?

Merci beaucoup!

+0

Si les noms de colonne sont identiques pour toutes les données. cadres que vous pourriez faire 'processList = lapply (fileList, fonction (x) fn_CustomFunc (DF = x))' où vous définissez 'fn_CustomFunc' une fonction personnalisée qui gère tout le traitement des données et utilise' rbind' pour combiner la sortie de toutes les données.frames – OdeToMyFiddle

Répondre

0

La logique peut être simplifiée. Essayez de créer une fonction personnalisée et appliquez-la sur toutes les données.

cleanDF <- function(mydf) { 
    if(all(!c('AlterPair_B', 'Alter.1.Name', 'Alter.2.Name') %in% 
      names(mydf))) stop("Check data frame names") 

    condition <- mydf[, 'AlterPair_B'] >= 4 
    mydf[condition, c("Alter.1.Name", "Alter.2.Name")] 
} 
big_list <- lapply(all_my_files, read.csv) #read in all data frames 
result <- do.call('rbind', lapply(big_list, cleanDF)) 

La fonction personnalisée cleanDF vérifie d'abord que tous les noms de colonnes pertinentes sont là. Ensuite, il définit la condition de 4 ou plus «AlterPair_B». Enfin, sous-ensemble les deux colonnes cibles par cette condition. J'ai utilisé une liste appelée "big_list" qui représente toutes les trames de données.

+0

Très utile! Je vous remercie! –

0

Vous n'avez pas fourni d'exemple reproductible, il est donc difficile de résoudre votre problème. Cependant, je ne veux pas que vos questions restent sans réponse. Il est vrai que l'utilisation de lapply serait une solution rapide, généralement préférable à une loop. Cependant, puisque vous avez mentionné être un débutant, voici comment le faire avec un loop, ce qui est plus facile à comprendre.

Vous devez placer tous vos fichiers csv dans un seul dossier avec rien d'autre. Ensuite, vous lisez les noms de fichiers et les mettez dans un list. Vous initialisez un objet résultat vide avec NULL. Vous lisez ensuite tous vos fichiers dans un loop, faites des calculs et rbind les résultats dans l'objet result.

path <-"C:/temp/csv/" 
list_of_csv_files <- list.files(path) 

result <- NULL 
for (filenames in list_of_csv_files) { 
input <- read.csv(paste0(path,filenames), header=TRUE, stringsAsFactors=FALSE) 
#Do your calculations 
input_with_calculations <- input 
result <- rbind(result,input_with_calculations) 
} 
result 
+0

Merci! Je vous remercie d'avoir pris le temps de me l'expliquer. –