rbind具有不同行长的文本文件
我正在尝试使用dif.length行数来绑定两个txt文件,例如: 我使用以下代码:rbind具有不同行长的文本文件,r,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=F
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())}))
我是新手,有什么解决办法吗?
非常感谢,我不喜欢扫描,不过,我相信它在某些情况下可以发挥作用 因此,我建议使用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()
将作为单个原子向量读取整个文件。您可以将列表传递给what
参数,但使用读取结构化数据的函数更容易、更安全。另外,您不想使用what=character()
,因为您正在读取数值
base R中的read.table()
,以及包“data.table”中的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)))
如果确实想使用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
##获取列数
nc你不应该探究为什么你会出现这个错误,而不是想要一个暴力解决方案,尤其是因为你是r的新手?我已经探索了一个解决方案,但我没有解决这个问题。对于一个新手来说,你的第一篇文章比我当时的好得多。我不确定你的意思,但似乎rbind(a,b)生成上面的输出。rbind.fill
从plyr软件包可能会起作用。我找到了此链接,但我仍然有相同的问题。感谢您的评论RawrTanks DJJ供您尝试。这给出了相同的警告。关于扫描,您是对的。它在一行中读取表。如果我有一个矩阵,我将用:1抱歉,在代码。现在它应该工作得更好。
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
## 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