rbind具有不同行长度的文本文件

时间:2015-02-24 19:55:23

标签: r

我正在尝试使用dif.length行来绑定两个txt文件,例如:

我使用此代码:

a<-matrix(1:12,4,3)
b<-matrix(21:41,7,3)

setwd("test/")
write.table(a, file="a.txt",quote=FALSE,  row.names=FALSE,col.names=FALSE)
write.table(b, file="b.txt",quote=FALSE, row.names=FALSE, col.names=FALSE)
file_list <- list.files()
g<- do.call(rbind,lapply(file_list,FUN=function(files){scan(files,what = character())}))

我有这条警告信息:

“在(function(...,deparse.level = 1)中:   结果列数不是矢量长度的倍数(arg 1)“

我希望g看起来像这样:

##       [,1] [,2] [,3]
##  [1,]    1    5    9
##  [2,]    2    6   10
##  [3,]    3    7   11
##  [4,]    4    8   12
##  [5,]   21   28   35
##  [6,]   22   29   36
##  [7,]   23   30   37
##  [8,]   24   31   38
##  [9,]   25   32   39
## [10,]   26   33   40
## [11,]   27   34   41

有没有解决方案,因为我是新手? 非常感谢,

2 个答案:

答案 0 :(得分:3)

除非你另有说明,否则scan()会将整个文件作为单个原子向量读取。您可以将列表传递给what参数,但使用读取结构化数据的函数会更容易,更安全。另外,您不想使用what = character(),因为您正在阅读数字值。

基数R中的

read.table()和来自包&#34; data.table&#34;的fread()可以很容易地做到这一点。

files <- c("a.txt", "b.txt")

## read.table()
data.matrix(do.call(rbind, lapply(files, read.table)), rownames.force = FALSE)

## fread()
library(data.table)
data.matrix(rbindlist(lapply(files, fread)))

这两个都返回矩阵

#       V1 V2 V3
#  [1,]  1  5  9
#  [2,]  2  6 10
#  [3,]  3  7 11
#  [4,]  4  8 12
#  [5,] 21 28 35
#  [6,] 22 29 36
#  [7,] 23 30 37
#  [8,] 24 31 38
#  [9,] 25 32 39
# [10,] 26 33 40
# [11,] 27 34 41

如果您真的想使用scan(),可以将列表传递给what参数,告诉它列数。

## get number of columns
nc <- max(unlist(lapply(files, count.fields)))
## read as a list, then bind together
do.call(rbind, lapply(files, function(x) {
    do.call(cbind, scan(x, what = as.list(double(nc)), quiet = TRUE))
}))
#       [,1] [,2] [,3]
#  [1,]    1    5    9
#  [2,]    2    6   10 
#  [3,]    3    7   11
#  [4,]    4    8   12
#  [5,]   21   28   35
#  [6,]   22   29   36
#  [7,]   23   30   37
#  [8,]   24   31   38
#  [9,]   25   32   39
# [10,]   26   33   40
# [11,]   27   34   41

但这只是count.fields()然后是scan(),这基本上是read.table()一步完成的事情。此外,如果数据中缺少值,则存在风险。

答案 1 :(得分:0)

我不是扫描的粉丝,但我确信它在某些情况下能达到目的。

因此,我建议使用read.csv和write.csv:

a<-matrix(1:12,4,3)
b<-matrix(21:41,7,3)

setwd("test/")
write.csv(a, file="a.txt",row.names=FALSE,col.names=FALSE)
write.csv(b, file="b.txt", row.names=FALSE, col.names=FALSE)
file_list <- list.files()
g <- do.call(rbind,lapply(file_list,FUN=function(files){read.csv(files)}))

如果你看看?scan。您可能会发现错误原因。我的理解是它正在一行阅读表格:

 > scan('a.txt',what=character())
## Read 6 items
## [1] "V1"             ",\"V2\",\"V3\"" "1,5,9"          "2,6,10"        
## [5] "3,7,11"         "4,8,12"        
 > scan('b.txt',what=character())
## Read 9 items
## [1] "V1"             ",\"V2\",\"V3\"" "21,28,35"       "22,29,36"      
## [5] "23,30,37"       "24,31,38"       "25,32,39"       "26,33,40"      
## [9] "27,34,41"