Именование одинаковых файлов xlsx с TRUE of FALSE, если на определенном листе присутствует символьная строка
Этот код читает файл xlsx и создает индивидуально именованные файлы на основе номера листа и значения, найденного в определенном месте (в данном случае temp[2,1]). Однако из-за того, что каждый файл и лист немного отличаются друг от друга, имена являются несовместимыми.
sheet_to_read <- c(11,12,13,14)
for( excelsheet in files) {
for (sheet in sheet_to_read) {
temp <- read_excel( path = excelsheet, sheet = sheet, col_names = FALSE)
write.csv( temp, file = paste0( "./", gsub("./", "", excelsheet), temp[2,1], sheet,".csv") )
}}
Мне бы хотелось, чтобы это был способ присвоения имен файлам ИСТИНА или ЛОЖЬ, если в листе присутствует какая-либо строка символов, в данном случае "vivax". Итак, в этом случае:
GBD2016_2_915_Boletin Epidemiologico_2016_37sheet21true.xls
GBD2016_2_915_Boletin Epidemiologico_2016_37sheet22false.xls`
Файл примера: https://drive.google.com/file/d/1p4HAuFl7Codine1Vvb8SzA7OHTzraaHz/view?usp=sharing
1 ответ
Поскольку у вас есть тиббл, и неизвестно, какой столбец имеет какой тип, я создал это:
isWordInTibble <- function(word, tibble) {
# case insensitive
any(unlist(
sapply(1:ncol(tibble),
function(i) tolower(word) %in% tolower(as.character(unlist(tibble[, i]))))))
}
Он смотрит, находится ли слово в любом из векторов столбцов - просматривает все столбцы.
Замените свой аргумент файла в вашем write.csv
команда по:
file = gsub(".xls",
paste0(substr(temp[2, 1],
1,
5), # just first 5 letters
gsub("sheet", "", sheet),
substr(tolower(as.character(isWordInTibble("vivax", tmp))),
1,
1), # just first letter ("t" or "f")
".csv"),
excelsheet)
Тогда это может сработать!
Я пытался сократить имена, используя substr(, start, end)
а также gsub()
,
аппендикс
Поскольку вы спросили, как печатать, то только файлы, содержащие слово, но не те, которые его не содержат:
В вашем примере вместо write.csv()
замените его на:
if (isWordInTibble("vivax", tmP)) {
write.csv(temp,
file = gsub(".xls",
paste0(substr(temp[2, 1],
1,
5), # just first 5 letters
gsub("sheet", "", sheet),
substr(tolower(as.character(isWordInTibble("vivax", temp))),
1,
1), # just first letter ("t" or "f")
".csv"),
excelsheet))
}
Тогда он печатается только если isWordInTibble
возвращается TRUE
,