如何使用 R 为没有数据点的列插入占位符?
How to insert placeholders for columns without data points using R?
我进行了几个实验,并使用我们的软件进行了分析。
如果软件能够分析图像,该软件会为每个实验生成一个单独的文件夹,其中包含一个名为 "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
但我不知道,我必须如何修改我的脚本才能生成这样的列表。如果我只进行很少的实验,那没问题。但在我的例子中,有数百个这样的列,如果有任何遗漏,手动验证将花费太多时间。
如果你能帮我解决这个问题,我将不胜感激!
最简单的做法是修改前两行,即文件列表和加载:
fileList = file.path(dir(path = ".", pattern = "A\d+", full.names = TRUE), "DistList.txt")
这会生成 所有 文件夹的文件列表,即使相应的 DistList.txt
文件不存在。接下来,如果它们存在,我们加载它们,否则我们只是 return 一个包含单个 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 文件。如果它不能这样做,则没有 .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
但我不知道,我必须如何修改我的脚本才能生成这样的列表。如果我只进行很少的实验,那没问题。但在我的例子中,有数百个这样的列,如果有任何遗漏,手动验证将花费太多时间。
如果你能帮我解决这个问题,我将不胜感激!
最简单的做法是修改前两行,即文件列表和加载:
fileList = file.path(dir(path = ".", pattern = "A\d+", full.names = TRUE), "DistList.txt")
这会生成 所有 文件夹的文件列表,即使相应的 DistList.txt
文件不存在。接下来,如果它们存在,我们加载它们,否则我们只是 return 一个包含单个 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
函数会愚蠢地为不存在的文件创建一个警告 除了错误 之外;我们在上面的代码中明确禁止显示此警告。