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

时间:2011-12-14 13:57:32

标签: r

我有一个制表符分隔的文本文件,我想读入R.这个文件就是我称之为“半结构化”的文件 - 也就是说,大多数文件由相同的数据框(300+)组成大小(32 * 30),带有colnames和rownames。在每个数据帧之前的行上,该数据帧有一个唯一的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))

(在读取数据中,所有行名称都排成一行 - 我把它弄乱了代码)。

2 个答案:

答案 0 :(得分:3)

使用skip的{​​{1}}和nrows参数来控制文件的哪些部分被读取。

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,因为您似乎正在使用制表符分隔文件。


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

答案 1 :(得分:2)

如果您的文件整齐排列在35个行块中(32行数据加上3行各种标题和间隔符),那么您可以使用readLines()一次获取一行,跳过标题和间隔符,读取32行数据,使用strsplit()分割数据行中的数据,依此类推。

它有点凌乱,依赖于你的文件完全符合指定(这些东西很少,你总会发现第143个东西中还有两行额外的guff)但它会完成这项工作。

这只是一些指示,显然你需要做一些工作才能使它发挥作用。

[鉴于这些colnames和rownames看起来像lat-long,你可能想考虑使用光栅包将它们加载到栅格堆栈中]