R - 将非对称数据文件转换为矩阵或数据帧

时间:2012-07-20 06:02:31

标签: r

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

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: convert asymmetric list to matrix - number of elements in each sub-list differ

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. 将整个数据集转换为列表,然后
  5. 使用上面的三行创建矩阵
  6. 然而,我陷入第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
    

1 个答案:

答案 0 :(得分: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"