R - Как посчитать количество файлов в каждой папке - PullRequest
0 голосов
/ 19 марта 2020

У меня есть папка со многими подпапками, и я хочу знать: 1. Количество файлов в каждой подпапке 2. Является ли это число нечетным или четным (но это не так)

Итак, я ' m ищет код / ​​функцию, где input - это PATH, а output - это таблица с: SUBDIRECTORY; количество файлов; ODD / EVEN

Предложения?

Ответы [ 2 ]

3 голосов
/ 19 марта 2020

Base R поставляется с удобной для этого функцией, называемой list.files. Используя аргумент шаблона, вы можете сузить область поиска ("." дает вам все файлы). Используя all.files = TRUE, вы также можете включить скрытые файлы.

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

Вы можете использовать split, чтобы разбить этот вектор на список с содержимым каждой папки в отдельных элементах списка.

# 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
1 голос
/ 19 марта 2020

Ниже приведена опция, в которой я создаю тиббл (фрейм данных) с одной переменной subfolder, содержащей имена подпапок. Затем я mutate, добавив file_n, итерируя по объединенному path + subfolder в str_glue, перейдя к dir и получив длину возвращаемого вектора с length. На последнем шаге я просто возвращаю TRUE, если file_n четное, и FALSE в противном случае, в переменной is_even:

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
           )

Вывод:

# 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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...