Цикл для включения разных папок и шаблонов - PullRequest
0 голосов
/ 18 октября 2018

У меня этот код очень неэффективный, и я хотел бы сделать его лучше.Каждый df представляет собой список файлов, которые соответствуют определенному шаблону, как описано в term6.

Может кто-нибудь показать мне лучший способ превратить это в эффективный и легко понятный код?Будет ли цикл лучше?

term6 <- c("Casos de Malaria|MALARIA8|Casos según Entidades")
term7 <- c("Casos según Entidades|MALARIA8")
term8 <- c("Distrito Capital10|hasta")
term9 <- c("NA12")
term10 <- c("hasta la semana|NA12|NA16|Entidades Federales16")
term11 <- c("NA19|Cuadro|Malaria16")

df6 <- list.files(path = "J:\\GBD2017\\Venezuela\\xlsx\\2006", pattern = term6, recursive = FALSE, full.names = FALSE, ignore.case = TRUE)
df7 <- list.files(path = "J:\\GBD2017\\Venezuela\\xlsx\\2007", pattern = term7, recursive = FALSE, full.names = FALSE, ignore.case = TRUE)
df8 <- list.files(path = "J:\\GBD2017\\Venezuela\\xlsx\\2008", pattern = term8, recursive = FALSE, full.names = FALSE, ignore.case = TRUE)
df9 <- list.files(path = "J:\\GBD2017\\Venezuela\\xlsx\\2009", pattern = term9, recursive = FALSE, full.names = FALSE, ignore.case = TRUE)
df10 <- list.files(path = "J:\\GBD2017\\Venezuela\\xlsx\\2010", pattern = term10, recursive = FALSE, full.names = FALSE, ignore.case = TRUE)
df11 <- list.files(path = "J:\\GBD2017\\Venezuela\\xlsx\\2011", pattern = term11, recursive = FALSE, full.names = FALSE, ignore.case = TRUE)

Ответы [ 2 ]

0 голосов
/ 18 октября 2018
c(
  "Casos de Malaria|MALARIA8|Casos según Entidades",
  "Casos según Entidades|MALARIA8",
  "Distrito Capital10|hasta",
  "NA12",
  "hasta la semana|NA12|NA16|Entidades Federales16",
  "NA19|Cuadro|Malaria16"
) -> terms

c(
  "J:\\GBD2017\\Venezuela\\xlsx\\2006", 
  "J:\\GBD2017\\Venezuela\\xlsx\\2007", 
  "J:\\GBD2017\\Venezuela\\xlsx\\2008", 
  "J:\\GBD2017\\Venezuela\\xlsx\\2009", 
  "J:\\GBD2017\\Venezuela\\xlsx\\2010",
  "J:\\GBD2017\\Venezuela\\xlsx\\2011"
) -> paths

unlist(lapply(seq_along(paths), function(.i) {
  list.files(
    path = paths[.i], 
    pattern = terms[.i], 
    recursive = FALSE, 
    full.names = FALSE, # generally not a good idea; I always set this to TRUE
    ignore.case = TRUE
  )  
}), use.names = FALSE)

Однако я бы порекомендовал сохранить термины и пути вместе.Таким образом, вы можете получить файл TSV (файл с разделителями табуляции или запятую) с метаданными поиска пути в нем и , а также обеспечить ограничение по длине для каждого вектора.

Это так же простоиспользовать:

data.frame(
  term = c(
    "Casos de Malaria|MALARIA8|Casos según Entidades",
    "Casos según Entidades|MALARIA8",
    "Distrito Capital10|hasta",
    "NA12",
    "hasta la semana|NA12|NA16|Entidades Federales16",
    "NA19|Cuadro|Malaria16"
  ),
  path = c(
    "J:\\GBD2017\\Venezuela\\xlsx\\2006", 
    "J:\\GBD2017\\Venezuela\\xlsx\\2007", 
    "J:\\GBD2017\\Venezuela\\xlsx\\2008", 
    "J:\\GBD2017\\Venezuela\\xlsx\\2009", 
    "J:\\GBD2017\\Venezuela\\xlsx\\2010",
    "J:\\GBD2017\\Venezuela\\xlsx\\2011"
  ),
  stringsAsFactors = FALSE
)-> file_search_df

unlist(lapply(1:nrow(file_search_df), function(.i) {
  list.files(
    path = file_search_df$path[.i], 
    pattern = file_search_df$term[.i], 
    recursive = FALSE, 
    full.names = FALSE, # generally not a good idea; I always set this to TRUE
    ignore.case = TRUE
  )  
}), use.names = FALSE)

И, если вы используете подход TSV, еще более компактный:

file_search_df <- read.csv("path-to-metadata-file.tsv", sep = "\t", stringsAsFactors=FALSE)

unlist(lapply(1:nrow(file_search_df), function(.i) {
  list.files(
    path = file_search_df$path[.i], 
    pattern = file_search_df$term[.i], 
    recursive = FALSE, 
    full.names = FALSE, # generally not a good idea; I always set this to TRUE
    ignore.case = TRUE
  )  
}), use.names = FALSE)
0 голосов
/ 18 октября 2018

Следующее должно немного привести в порядок ваш код:

#myfilepaths <- paste0(rep(getwd(),6))
myfilepaths <-  c(paste0('J:\\GBD2017\\Venezuela\\xlsx\\',2006:2011))
allterms <- c("test","Casos según Entidades|MALARIA8","Distrito Capital10|hasta", "NA12", "hasta la semana|NA12|NA16|Entidades Federales16", "NA19|Cuadro|Malaria16")
length(myfilepaths)==length(allterms)
searchtree <- data.frame(myfilepaths, allterms, stringsAsFactors = F)
result <- apply(searchtree, 1, function(x) list.files(x["myfilepaths"], pattern=x["allterms"], recursive = FALSE, full.names = FALSE, ignore.case = TRUE))

Идея состоит в том, чтобы: 1) создать список папок, вставив диапазон года в корень, затем поместить все комбинации путей ишаблоны для поиска в аккуратном фрейме данных и 2) для применения функции list.files к этому df.Это дает вам список из 6 элементов.

> result
[[1]]
[1] "ctest.R"       "ExcelTest.csv" "test.csv"      "test.xls"     

[[2]]
character(0)

[[3]]
character(0)

[[4]]
character(0)

[[5]]
character(0)

[[6]]
character(0)

Или вы можете также использовать цикл, подобный так, получая в точности то же самое:

result <- list()
for(i in 1:length(allterms)) {
  result[[i]] <- list.files(searchtree[i,"myfilepaths"], pattern=searchtree[i,"allterms"], recursive = FALSE, full.names = FALSE, ignore.case = TRUE)
}
result

edit: если у вас более одногошаблон для каждой папки, например, если вы хотите выполнить поиск в папке 2006 по обоим "test" и "Casos según Entidades|MALARIA8", вы должны создать searchtree data.frame следующим образом:

searchtree <- data.frame(myfilepaths[c(1,1:6)], allterms[c(1:2,2:6)], stringsAsFactors = F)
colnames(searchtree) <- c("myfilepaths", "allterms")

Функция будет искатьлюбой шаблон, который находится в той же строке, что и любая папка.

searchtree
                     myfilepaths                                        allterms
1 J:\\GBD2017\\Venezuela\\xlsx\\2006                                            test
2 J:\\GBD2017\\Venezuela\\xlsx\\2006                  Casos según Entidades|MALARIA8
3 J:\\GBD2017\\Venezuela\\xlsx\\2007                  Casos según Entidades|MALARIA8
4 J:\\GBD2017\\Venezuela\\xlsx\\2008                        Distrito Capital10|hasta
5 J:\\GBD2017\\Venezuela\\xlsx\\2009                                            NA12
6 J:\\GBD2017\\Venezuela\\xlsx\\2010 hasta la semana|NA12|NA16|Entidades Federales16
7 J:\\GBD2017\\Venezuela\\xlsx\\2011                           NA19|Cuadro|Malaria16

Или вы можете управлять им вручную:

allfolders <- c("folder1","folder1", "folder2")
allpatterns <- c("pattern1", "pattern2", "pattern2")
searchtree <- data.frame(myfilepaths, allterms, stringsAsFactors = F)
searchtree

  myfilepaths allterms
1     folder1 pattern1
2     folder1 pattern2
3     folder2 pattern2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...