J'essaie de lire les données d'un répertoire imbriqué dans R pour l'analyse. j'ai essayé

list.files(pattern = "*.mass", recursive =T) # .mass is the file Extension I´m interested in.

Qui crée une liste de tous les fichiers

> head(list.files(pattern = "*.mass", recursive = T))
[1] "No_Vegetation/Rain17_45/No_MT/1/Test1_out.mass" "No_Vegetation/Rain17_45/No_MT/2/Test1_out.mass"
[3] "No_Vegetation/Rain17_45/No_MT/4/Test1_out.mass" "No_Vegetation/Rain17_45/No_MT/5/Test1_out.mass"
[5] "No_Vegetation/Rain17_45/No_MT/6/Test1_out.mass" "No_Vegetation/Rain17_60/No_MT/1/Test1_out.mass"
> tail(list.files(pattern = "*.mass", recursive = T))
[1] "vegetation/Rain20_45/No_MT/6/Test1_out.mass" "vegetation/Rain20_60/No_MT/1/Test1_out.mass"
[3] "vegetation/Rain20_60/No_MT/2/Test1_out.mass" "vegetation/Rain20_60/No_MT/4/Test1_out.mass"
[5] "vegetation/Rain20_60/No_MT/5/Test1_out.mass" "vegetation/Rain20_60/No_MT/6/Test1_out.mass"

Ensuite, j'essaie de lire les fichiers en utilisant

dt <- list.files(pattern = "*.mass", recursive = T) %>% map_df(~fread(.))
str(dt)
Classes ‘data.table’ and 'data.frame':  39814 obs. of  14 variables:
 $ time_[s]           : num  0 64.7 125.5 186.2 247.1 ...
 $ dt_[s]             : num  60 5.18 4.47 2.92 2.48 ...
 $ massDomain_[m3]    : num  0 6.18 11.78 17.34 22.88 ...
 $ massBound_[m3]     : num  0 -0.00923 -0.01781 -0.01316 -0.0127 ...
 $ massSource_[m3]    : num  0 0.496 0.428 0.28 0.238 ...
 $ massError_[-]      : num  0.00 1.72e-13 1.44e-15 1.76e-14 -1.11e-14 ...
 $ BoundaryFlow_[m3/s]: num  0 -0.00178 -0.00398 -0.0045 -0.00511 ...
 $ RainRate_[mm/hr]   : num  0 17 17 17 17 17 17 17 17 17 ...
 $ accumRain_[m3]     : num  0 7.22 13.99 20.77 27.56 ...
 $ inf_[m3/s]         : num  0 0.0158 0.0158 0.0158 0.0158 ...
 $ accumInf_[m3]      : num  0 1.02 1.98 2.94 3.9 ...
 $ perc_[m3/s]        : num  0 0 0 0 0 0 0 0 0 0 ...
 $ bc1_[m3/s]         : num  0 0 -0.000257 -0.003607 -0.004206 ...
 $ bc1Acum_[m3]       : num  0 -0.0166 -0.2356 -0.4913 -0.7855 ..

Et il combine tous les fichiers dans un data.frame ou data.table, sans différencier les fichiers.

Ce que je voudrais faire, c'est créer de nouvelles variables de chaîne à partir des noms de fichiers et les ajouter aux données.

Par exemple, je voudrais créer des variables comme celle-ci :

veg <- c("vegetation", "No_Vegetation")
Rain <- c("Rain17_45", "Rain17", "Rain20_45", "Rain20_60")
Roughness <- c("MT", "No_MT")
Geom <- c("1", "2", "3", "4", "5", "6")

Les nouvelles variables sont veg, Rain, Geom et Rugness, tandis que les entrées Vector sont les données de données qui doivent couvrir l'ensemble du dt. par conséquent, je veux que pour chaque nouvelle variable, la chaîne corect soit affectée, selon qu'elle trouve ou non la chaîne dans le fichier Name.

Toute aide serait appréciée. Merci

0
M Terry 20 nov. 2019 à 14:54

1 réponse

Meilleure réponse

Vous pouvez modifier la partie .f de map_df pour ajouter le nom de fichier en tant que colonne. Ensuite, tstrsplit pourrait être invoqué pour créer les nouvelles colonnes et les ajouter par exemple ci-dessous

list.files(pattern = "*.mass", recursive = T) %>% 
  map_df(., .f = function(x){
    dt <- fread(x)
    dt$file <- x
    dt
  })

tstrsplit("No_Vegetation/Rain17_45/No_MT/1/Test1_out.mass",
          "/")[1:4]
1
Jonny Phelps 20 nov. 2019 à 12:03