1

我看起来像这样的大型凌乱数据文件:

1 2  3    4   5 6  7   8 . .
aa bb  ccc d eee     ffff gg h i jj
6      6   5 1 2 3 4 5i      734
33  44x    1234  12  1    9  888  345     12   987765

数据文件中的大多数(但不是全部)行具有相同数量的元素。读取此类数据文件并将其转换为矩阵或数据框的最佳方法是什么?

我一直在使用readLines读取文件。

另外,我从对我之前的一个问题的回答中知道,可以使用以下三行将非对称列表转换为矩阵:

R:将非对称列表转换为矩阵 - 每个子列表中的元素数量不同

max.len <- max(sapply(my.data, length))
corrected.list <- lapply(my.data, function(x) {c(x, rep(NA, max.len - length(x)))})
mat <- do.call(rbind, corrected.list)

我在想也许我可以:

  1. 读取数据文件readLines
  2. 将数据集中的每一行拆分为其单独的元素,然后
  3. 将整个数据集转换成一个列表,然后
  4. 使用上面的三行创建一个矩阵

但是,我被困在第 2 步。我无法弄清楚如何将每一行拆分为单独的元素,因为元素之间的空格数量会有所不同。此外,我怀疑提出的 4 步策略效率不高。

感谢您对这个问题的任何帮助。

编辑

对不起,我忘了发布想要的结果。我希望数据在矩阵或数据框中后看起来像这样:

1   2    3     4   5    6     7    8    .    .
aa  bb   ccc   d   eee  ffff  gg   h    i    jj
6   6    5     1   2    3     4    5i   734  NA
33  44x  1234  12  1    9     888  345  12   987765
4

1 回答 1

1

你可以strsplit用来实现第 2 部分吗?

test <- readLines(textConnection("1 2  3    4   5 6  7   8 . .
aa bb  ccc d eee     ffff gg h i jj
6      6   5 1 2 3 4 5i      734
33  44x    1234  12  1    9  888  345     12   987765"))

test <- strsplit(test,"[[:space:]]+")

max.len <- max(sapply(test, length))
corrected.list <- lapply(test, function(x) {c(x, rep(NA, max.len - length(x)))})
mat <- do.call(rbind, corrected.list)

结果:

> mat
     [,1] [,2]  [,3]   [,4] [,5]  [,6]   [,7]  [,8]  [,9]  [,10]   
[1,] "1"  "2"   "3"    "4"  "5"   "6"    "7"   "8"   "."   "."     
[2,] "aa" "bb"  "ccc"  "d"  "eee" "ffff" "gg"  "h"   "i"   "jj"    
[3,] "6"  "6"   "5"    "1"  "2"   "3"    "4"   "5i"  "734" NA      
[4,] "33" "44x" "1234" "12" "1"   "9"    "888" "345" "12"  "987765"
于 2012-07-20T06:27:36.810 回答