我看起来像这样的大杂乱的数据文件:
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)
我想也许我可以:
readLines
然而,我陷入第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 :(得分: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"