【问题标题】:How to insert placeholders for columns without data points using R?如何使用 R 为没有数据点的列插入占位符?
【发布时间】:2019-03-30 23:13:07
【问题描述】:

我已经使用我们的软件进行了一些实验,并对其进行了分析。 该软件为每个实验生成一个单独的文件夹,其中包含一个名为“DistList”的 .txt 文件,如果该软件能够分析图像。如果它不能这样做,则没有 .txt 文件。 一般来说,如果有 DistList,文件夹排列是这样的:

为了将所有这些 .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

但我不知道,我必须如何修改我的脚本以生成这样的列表。如果我只是进行很少的实验,那将没有问题。但在我的例子中,有数百个这样的列,如果缺少任何内容,手动验证将花费太多时间。

如果您能帮我解决这个问题,我将不胜感激!

【问题讨论】:

    标签: r list csv dataframe missing-data


    【解决方案1】:

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

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

    这会为 所有 文件夹生成文件列表,即使对应的 DistList.txt 文件不存在。接下来,如果它们存在,我们就加载它们,否则我们只返回一个包含单个 NA 的 tibble(不要忘记在执行此函数之前加载‹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 在这种情况下更加健壮。

    不幸的是,在read.table 内部调用的file 函数会愚蠢地为不存在的文件创建一个警告除了错误;我们在上面的代码中明确禁止这个警告。

    【讨论】:

    • 感谢您的帮助。不幸的是,如果那里没有 DistList.txt 文件,它还不能工作。然后它会产生错误消息“1:在文件中(文件,“rt”):无法打开文件 A01/DistList.txt:没有这样的文件或目录”
    • @Hotshot Gotcha。请参阅固定答案。请注意,您发布的错误消息实际上只是一个我们可以忽略的警告。但是,代码中仍然存在错误。
    • 实际上考虑tryCatchwarning = function(...)块并让它也返回tibble(NA)
    猜你喜欢
    • 1970-01-01
    • 2012-12-22
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多