2012-07-20 114 views
1

我的大混乱的数据看起来是这样的文件:的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. 使用上面的三条线来创建矩阵

然而,我停滞在第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 
+0

你到底想上面的数据看起来像当它被设定为R? – 2012-07-20 06:07:15

回答

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"