如何使用R为没有数据点的列插入占位符?

时间:2018-10-26 08:26:24

标签: r list csv dataframe missing-data

我已经执行了一些使用我们的软件进行分析的实验。 如果该软件能够分析图像,则该软件会为每个实验产生一个单独的文件夹,其中包含一个.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 :(得分:1)

最简单的方法是修改前两行,即文件列表和加载:

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

即使相应的DistList.txt文件不存在,它也会为 all 个文件夹生成文件列表。接下来,如果它们存在,我们将它们加载,否则,我们将返回一个包含单个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函数会愚蠢地为不存在的文件创建除错误以外的警告 ;我们在上面的代码中明确禁止了该警告。