Mam folder z wieloma podfolderami i chcę wiedzieć: 1. Liczba plików w każdym podfolderze 2. Czy liczba ta jest dziwna, czy nawet (ale jest to nieletni)

Szukam kodu / funkcji, w którym wejście jest ścieżką i wyjście jest tabelą z: Podkatalogu; # plików; Nieparzyste / nawet.

Propozycje?

r
1
anakar 19 marzec 2020, 13:15

2 odpowiedzi

Najlepsza odpowiedź

Podstawa R jest wyposażona w poręczną funkcję do tego zwanego list.files. Korzystanie z argumentu wzoru można zawęzić wyszukiwanie ({x2}} zapewnia wszystkie pliki). Używanie all.files = TRUE można również zawierać ukryte pliki.

folder <- "C:/Users/Johannes Gruber/Pictures"
files <-  list.files(folder, pattern = ".", all.files = FALSE, recursive = TRUE, full.names = TRUE)

# number of all files
length(files)
#> [1] 182

Możesz użyć split, aby podzielić ten wektor na listę za pomocą zawartości każdego folderu w oddzielnych elementach listy.

# 1. The number of files in each subfolder
dir_list <- split(files, dirname(files))
files_in_folder <- sapply(dir_list, length)
head(files_in_folder)
#>                 C:/Users/Pictures 
#>                                                10 
#> C:/Users/Pictures/2019/2019-12-30 
#>                                                 3 
#> C:/Users/Pictures/2019/2019-12-31 
#>                                                 9 
#> C:/Users/Pictures/2020/2020-01-01 
#>                                                 6 
#> C:/Users/Pictures/2020/2020-01-03 
#>                                                 2 
#> C:/Users/Pictures/2020/2020-01-04 
#>                                                26

# 2. Whether that number is odd or even (but this is minor)
even <- sapply(files_in_folder, function(x) x %% 2 == 0)
head(even)
#>                 C:/Users/Pictures 
#>                                              TRUE 
#> C:/Users/Pictures/2019/2019-12-30 
#>                                             FALSE 
#> C:/Users/Pictures/2019/2019-12-31 
#>                                             FALSE 
#> C:/Users/Pictures/2020/2020-01-01 
#>                                              TRUE 
#> C:/Users/Pictures/2020/2020-01-03 
#>                                              TRUE 
#> C:/Users/Pictures/2020/2020-01-04 
#>                                              TRUE
4
JBGruber 19 marzec 2020, 10:35

Oto opcja Tidyverse, w której tworzę kratkę (ramę danych) z pojedynczą zmienną subfolder zawierającą nazwy podfolderów. Następnie i mutate, dodając file_n, przez itersting nad połączonym {x3}} + subfolder w str_glue, przechodząc do dir i uzyskanie długości Zwrócony wektor z length. W ostatnim kroku po prostu wróciłem TRUE Jeśli file_n jest nawet, a {{x10}} inaczej, w zmiennej {x11}}:

library(tidyverse)

path <- "~/folder/"

tibble(subfolder = dir(path)) %>% 
    mutate(file_n = map_int(str_glue("{path}{subfolder}"), ~ dir(.) %>% length),
           is_even = file_n %% 2 == 0
           )

Wynik:

# A tibble: 3 x 3
  subfolder  file_n is_even
  <chr>       <int> <lgl>  
1 subfolder1      1 FALSE  
2 subfolder2      2 TRUE   
3 subfolder3      3 FALSE  
1
gersht 19 marzec 2020, 10:51