我正在尝试使用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
有没有解决方案,因为我是新手? 非常感谢,
答案 0 :(得分:3)
除非你另有说明,否则scan()
会将整个文件作为单个原子向量读取。您可以将列表传递给what
参数,但使用读取结构化数据的函数会更容易,更安全。另外,您不想使用what = character()
,因为您正在阅读数字值。
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"