Как вставить заполнители для столбцов без точек данных, используя R? - PullRequest
0 голосов
/ 26 октября 2018

Я провел несколько экспериментов, которые проанализировал с помощью нашего программного обеспечения. Это программное обеспечение выдает для каждого эксперимента отдельную папку, содержащую файл .txt, который называется «DistList», если программное обеспечение могло анализировать изображения. Если это не удалось сделать, файл .txt отсутствует. В общем случае расположение папок выглядит так, если есть DistList:

enter image description here

Чтобы собрать все эти файлы .txt, я уже создал скрипт R:

setwd("~/Desktop/Results/.")

fileList <- list.files(path = ".", recursive = TRUE, pattern = "DistList.txt", full.names = TRUE)

listData <- lapply(fileList, read.table)

names(listData) <- basename(dirname(fileList))

library(tidyverse)
library(reshape2)

bind_rows(listData, .id = "FileName") %>%
  group_by(FileName) %>%
  mutate(rowNum = row_number()) %>%
  dcast(rowNum~FileName, value.var = "V1") %>%
  select(-rowNum) %>%
  write.csv(file="Result.csv")

В этой форме теперь выдается документ со следующей структурой, поскольку в A03 и A04 нет файла DistList.txt:

A01    A02    A05
103    118    558
225    545    779
228    666    898
553    1002   1883
966    2004   NA
1112   3332   NA
NA     4556   NA
NA     5596   NA
NA     6639   NA

Однако мне хотелось бы иметь список, в котором папки, не содержащие документ DistList.txt, также перечислены в результирующем файле .csv, например:

A01    A02    A03   A04   A05
103    118    NA    NA    558
225    545    NA    NA    779
228    666    NA    NA    898
553    1002   NA    NA    1883
966    2004   NA    NA    NA
1112   3332   NA    NA    NA
NA     4556   NA    NA    NA
NA     5596   NA    NA    NA
NA     6639   NA    NA    NA

Но я не знаю, как мне изменить свой сценарий таким образом, чтобы он вывел такой список. Это было бы не проблема, если бы у меня было очень мало экспериментов. Но в моем случае таких столбцов несколько сотен, и проверка вручную, если что-то пропущено, займет слишком много времени.

Буду очень признателен, если вы поможете мне с этой проблемой!

1 Ответ

0 голосов
/ 26 октября 2018

Самое простое, что нужно сделать, это изменить первые две строки, т.е. список файлов и загрузку:

fileList = file.path(dir(path = ".", pattern = "A\\d+", full.names = TRUE), "DistList.txt")

Создает список файлов для всех папок, даже если соответствующий файл DistList.txt не существует. Затем мы загружаем их, если они существуют, в противном случае мы просто возвращаем tibble, содержащий один NA (не забудьте загрузить пакет ‹tibble› перед выполнением этой функции):

load_if_exists = function (filename, ...) {
    tryCatch(
        suppressWarnings(read.table(filename, ...)),
        error = function (x) tibble(NA)
    )
}

listData = lapply(fileList, load_if_exists)

Обратите внимание, что load_if_exists использует tryCatch, а не полагается на file.exists. Это, вероятно, неважно в вашем случае, но в целом вы не можете полагаться на проверки существования файла, поскольку файловая система не синхронизирована, т. Е. теоретически чтение файла может завершиться неудачей, даже если предыдущая проверка существования файла прошла успешно. tryError поэтому более устойчив в такой ситуации.

К сожалению, функция file, вызываемая внутри read.table, будет глупо создавать предупреждение в дополнение к ошибке для несуществующих файлов; мы подавляем это предупреждение явно в коде выше.

...