gpt4 book ai didi

在 R 中读取半结构化文本文件

转载 作者:行者123 更新时间:2023-12-04 10:27:42 27 4
gpt4 key购买 nike

我有一个制表符分隔的文本文件,我想读入 R。该文件就是我所说的“半结构化”文件 - 也就是说,大部分文件由相同大小的数据帧 (300+) (32 *30),带有列名和行名。在每个数据帧之前的行上,该数据帧有一个唯一的 ID(ID1 ... 等),每个数据帧之间有一个空白行。

我尝试使用以下命令将文件读入 R:

read.table(file = "my.file", header = TRUE, sep = "\t",
na.strings = " ", blank.lines.skip = FALSE)

效果很好,但是整个文件被读取为单个因素中的级别。理想情况下,我最终会喜欢列表中的数据,每个数据框都是列表中的一个元素,唯一的 ID 作为每个列表元素的键。这是使用上述命令读取的文件开头的两个矩阵的示例(尽管它们表示为单个因子,但数据的形状与文本文件中的相同)。关于如何阅读并重新整理成列表的任何想法?
Ind <- structure(list(ID.1 = structure(c(2L, 43L, 41L, 39L, 37L, 35L, 
33L, 31L, 30L, 29L, 28L, 27L, 26L, 25L, 22L, 20L, 18L, 17L, 16L,
15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 4L, 3L, 1L, 5L,
2L, 43L, 42L, 40L, 38L, 36L, 34L, 32L, 30L, 29L, 28L, 27L, 26L,
24L, 23L, 21L, 19L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L,
8L, 7L, 6L, 4L, 3L), .Label = c("", " 66.5E 67.5E 68.5E 69.5E 70.5E 71.5E 72.5E 73.5E 74.5E 75.5E 76.5E 77.5E 78.5E 79.5E 80.5E 81.5E 82.5E 83.5E 84.5E 85.5E 86.5E 87.5E 88.5E 89.5E 90.5E 91.5E 92.5E 93.5E 94.5E 95.5E 96.5E 97.5E",
" 8.5N 0.0 0.0 0.0 ",
" 9.5N 0.0 0.0 0.0 0.0 ",
" ID=2", " 10.5N 0.0 0.0 0.0 0.0 0.0 ",
" 11.5N 0.0 0.0 0.0 0.0 0.0 ",
" 12.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 13.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 14.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 15.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 16.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 17.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 18.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 19.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 20.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 21.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 22.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 22.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 23.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 23.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.1 1.5 0.3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 24.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 24.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.9 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 25.5N 0.0 0.0 0.0 0.0 0.0 0.0 2.2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 25.5N 0.0 0.0 0.0 0.0 0.0 1.6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 26.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 27.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0",
" 28.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0",
" 29.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 30.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 31.5N 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 31.5N 0.0 0.0 0.0 2.9 4.6 4.5 ",
" 32.5N 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 32.5N 0.0 0.0 0.0 1.2 5.4 4.2 ",
" 33.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 33.5N 0.0 0.0 0.0 0.0 0.9 0.7 2.5 ",
" 34.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 34.5N 0.0 0.0 0.0 0.0 0.4 0.6 1.5 ",
" 35.5N 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 35.5N 0.0 0.0 0.0 0.0 0.2 0.4 1.0 1.6 ",
" 36.5N 0.0 0.0 0.0 0.0 0.0 0.0 ",
" 36.5N 0.0 0.0 0.0 0.0 0.3 0.6 ",
" 37.5N "
), class = "factor")), .Names = "ID.1", class = "data.frame", row.names = c(NA,
-64L))

(在读取的数据中,行名都排成一行——我把代码缩进搞砸了)。

最佳答案

使用 skipnrows read.table 的参数控制读取文件的哪些部分。

start_rows <- seq(2, by = 35, length.out = 300)
data_list <- lapply(start_rows, function(skip)
{
read.table(<as before>, skip = skip, nrows = 32)
})

您可以使用 scan 以类似的方式获取数据集的名称。 .
name_rows <- start_rows - 1
data_names <- sapply(name_rows, function(skip)
{
scan(the_file, character(), n = 1, nlines = 1, skip = skip)
})
names(data_list) <- data_names

作为一个次要的代码整理点,考虑交换 read.table对于 read.delim ,因为您似乎正在使用制表符分隔的文件。

正如 Spacedman 所指出的,这种解决方案存在速度问题。我不知道它们是否会成为这么多数据的大问题,但它肯定不会很好地扩展。一种解决方案是使用 readLines 进行预处理步骤。阅读所有内容,然后重复调用 writeLines在每个带有数据的行 block 上。
这样,每个数据框都保存在自己的文件中,您可以正常使用它们。

关于在 R 中读取半结构化文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8505671/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com