Извлечение и сопоставление наборов из списка имен файлов - PullRequest
1 голос
/ 05 ноября 2019

У меня есть набор данных из 4000+ изображений. Для выяснения кода я переместил небольшое их подмножество в другую папку.

Файлы выглядят так:

папка

[1] "r01c01f01p01-ch3.tiff" "r01c01f01p01-ch4.tiff" "r01c01f02p01-ch1.tiff"
[4] "r01c01f03p01-ch2.tiff" "r01c01f03p01-ch3.tiff" "r01c01f04p01-ch2.tiff"
[7] "r01c01f04p01-ch4.tiff" "r01c01f05p01-ch1.tiff" "r01c01f05p01-ch2.tiff"
[10] "r01c01f06p01-ch2.tiff" "r01c01f06p01-ch4.tiff" "r01c01f09p01-ch3.tiff"
[13] "r01c01f09p01-ch4.tiff" "r01c01f10p01-ch1.tiff" "r01c01f10p01-ch4.tiff"
[16] "r01c01f11p01-ch1.tiff" "r01c01f11p01-ch2.tiff" "r01c01f11p01-ch3.tiff"
[19] "r01c01f11p01-ch4.tiff" "r01c02f10p01-ch1.tiff" "r01c02f10p01-ch2.tiff"
[22] "r01c02f10p01-ch3.tiff" "r01c02f10p01-ch4.tiff"

Я не могуудалите имя до -ch #, так как эта информация важна. Однако я хочу отфильтровать этот список изображений и вернуть только наборы (например, r01c02f10p01), которые имеют все четыре значения ch (ch1-4).

Я изначально думал, что мы могли быподойдите к вопросу следующим образом:

ch1 <- dir(path="/Desktop/cp/complete//", pattern="ch1")
ch2 <- dir(path="/Desktop/cp/complete//", pattern="ch2")
ch3 <- dir(path="/Desktop/cp/complete//", pattern="ch3")
ch4 <- dir(path="/Desktop/cp/complete//", pattern="ch4")

Применение этого списка с помощью функции file.remove, аналогично следующему:

final2 <- dir(path="/Desktop/cp1/Images//", pattern="ch5") 
file.remove(folder,final2) 

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

Ранее я мог удалить все изображения с ch5 из моего набора изображений, как это. Я думал, что это может быть полезно при попытке отфильтровать только те изображения, которые имеют ch1-ch4, но я не уверен, что делать дальше.

##Create folder variable which has all image files 
folder <- list.files(getwd())

##Create final2 variable which has all image files ending in ch5
final2 <- dir(path="/Desktop/cp1/Images//", pattern="ch5") 

##Remove final2 from folder
file.remove(folder,final2) 

Подводя итог: я ожидаю отфильтровать файлы из случайного ассортимента без полных значений ch (то есть: возможно, только ch1 и ch2, или ch3 и ch4, или ch1, ch2, ch3 и ch4),к ассортименту, который содержит только файлы, которые имеют полный набор (четыре файла с ch1, ch2, ch3 и ch4).

1 Ответ

1 голос
/ 05 ноября 2019

Начиная с вектора имен файлов, как вы получили бы из list.files или чего-то подобного, вы можете создать фрейм данных имен файлов, использовать регулярное выражение для извлечения буквенно-цифровой части в начале и числа, следующего за "-ch". Затем убедитесь, что все элементы ожидаемого набора (я поместил это в ch_set, но, возможно, есть другой способ сделать это), присутствуют в наборе значений CH каждой группы.

# assume this is the vector of file names that comes from list.files
# or something comparable
files <- c("r01c01f01p01-ch3.tiff", "r01c01f01p01-ch4.tiff", "r01c01f02p01-ch1.tiff", "r01c01f03p01-ch2.tiff", "r01c01f03p01-ch3.tiff", "r01c01f04p01-ch2.tiff", "r01c01f04p01-ch4.tiff", "r01c01f05p01-ch1.tiff", "r01c01f05p01-ch2.tiff", "r01c01f06p01-ch2.tiff", "r01c01f06p01-ch4.tiff", "r01c01f09p01-ch3.tiff", "r01c01f09p01-ch4.tiff", "r01c01f10p01-ch1.tiff", "r01c01f10p01-ch4.tiff", "r01c01f11p01-ch1.tiff", "r01c01f11p01-ch2.tiff", "r01c01f11p01-ch3.tiff", "r01c01f11p01-ch4.tiff", "r01c02f10p01-ch1.tiff", "r01c02f10p01-ch2.tiff", "r01c02f10p01-ch3.tiff", "r01c02f10p01-ch4.tiff")

library(dplyr)

ch_set <- 1:4

files_to_keep <- data.frame(filename = files, stringsAsFactors = FALSE) %>%
  tidyr::extract(filename, into = c("group", "ch"), regex = "(^[\\w\\d]+)\\-ch(\\d)", remove = FALSE) %>%
  mutate(ch = as.numeric(ch)) %>%
  group_by(group) %>% 
  filter(all(ch_set %in% ch))

files_to_keep
#> # A tibble: 8 x 3
#> # Groups:   group [2]
#>   filename              group           ch
#>   <chr>                 <chr>        <dbl>
#> 1 r01c01f11p01-ch1.tiff r01c01f11p01     1
#> 2 r01c01f11p01-ch2.tiff r01c01f11p01     2
#> 3 r01c01f11p01-ch3.tiff r01c01f11p01     3
#> 4 r01c01f11p01-ch4.tiff r01c01f11p01     4
#> 5 r01c02f10p01-ch1.tiff r01c02f10p01     1
#> 6 r01c02f10p01-ch2.tiff r01c02f10p01     2
#> 7 r01c02f10p01-ch3.tiff r01c02f10p01     3
#> 8 r01c02f10p01-ch4.tiff r01c02f10p01     4

Теперь, когдау вас есть датафрейм с полными группами, просто вытащите соответствующие имена файлов:

files_to_keep$filename
#> [1] "r01c01f11p01-ch1.tiff" "r01c01f11p01-ch2.tiff" "r01c01f11p01-ch3.tiff"
#> [4] "r01c01f11p01-ch4.tiff" "r01c02f10p01-ch1.tiff" "r01c02f10p01-ch2.tiff"
#> [7] "r01c02f10p01-ch3.tiff" "r01c02f10p01-ch4.tiff"

Следует отметить, что это работало без строки mutate, где я преобразовал ch в числовое значение, т.е. сравнивая символьные версии этих чисел с обычными числовыми версиями их - потому что под капотом %in% преобразуется в совпадающие типы. Это было не совсем безопасно, если вам нужно было масштабировать это, поэтому я преобразовал их в соответствующие типы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...