在 R 中,如何从列表写入每行包含一定数量元素的文件?
In R, How to write from a list to file with a set amount of elements on each line?
假设我有一个包含 23 个元素的列表。
ls <- list(1:23)
我想写入一个文件,该文件每行有 5 个元素,用制表符分隔,直到不再可能:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23
我该怎么做?我在 write.lines 或 write.table.
中没有看到任何选项
@akrun 的代码效果最好:
cat(gsub("\s*((\d+\s+){1,4}\d+)", "\1\n",
paste(unlist(ls), collapse="\t")), '\n', file = 'file1.txt')
十进制值有一个小错误,结果 file1.txt
如下所示:
0.0005862 0.0005983 0.0006225 0.0006637 0
.0006622 0.0006197 0.000599 0.0005983 0
.0006247 0.0006707 0.0006641 0.0006253 0
.0006087 0.0006234 0.0006807 0.0007485 0
.0007546 0.0007 0.000643 0.0006183 0
.0006264 0.0006819 0.000697 0.0006453 0
您首先需要定义块,我使用具有 chunk
功能的 BBmisc 来获取 N 个元素的块(在您的情况下为五个)。
然后你可以使用 write.table 有 append
选项。
library(BBmisc)
x <-list(1:20)
n<-5
splited<-chunk(x[[1]],n)
for(i in 1:length(splited)){
x=splited[[i]]
line=paste(x,collapse = "\t")
write.table(line, file = "output.txt", sep = "\t",
row.names = FALSE, col.names = FALSE, quote = FALSE, append = T)
}
此致
可以用cat
和gsub
来完成。 unlist
将 list
、paste
组合成一个字符串,在每个带空格的 'n' 数字块处插入下一行 (\n
),并使用 cat
写入控制台
cat(gsub("\s*((\d+\s+){1,4}\d+)", "\1\n",
paste(unlist(ls), collapse="\t")), '\n')
#1 2 3 4 5
#6 7 8 9 10
#11 12 13 14 15
#16 17 18 19 20
#21 22 23
或写入文件
cat(gsub("\s*((\d+\s+){1,4}\d+)", "\1\n",
paste(unlist(ls), collapse="\t")), '\n', file = 'file1.txt')
如果它是一个带有科学记数法等的复杂数据,我们可以将split
变成一个list
,然后在末尾附加NA
用于那些元素数量较少的元素
v1 <- unlist(ls)
lst1 <- split(v1, (seq_along(v1)-1) %/% 4 + 1)
mat1 <- do.call(rbind, lapply(lst1, `length<-`, max(lengths(lst1))))
write(mat1, 'file2.txt')
假设我有一个包含 23 个元素的列表。
ls <- list(1:23)
我想写入一个文件,该文件每行有 5 个元素,用制表符分隔,直到不再可能:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23
我该怎么做?我在 write.lines 或 write.table.
中没有看到任何选项@akrun 的代码效果最好:
cat(gsub("\s*((\d+\s+){1,4}\d+)", "\1\n",
paste(unlist(ls), collapse="\t")), '\n', file = 'file1.txt')
十进制值有一个小错误,结果 file1.txt
如下所示:
0.0005862 0.0005983 0.0006225 0.0006637 0
.0006622 0.0006197 0.000599 0.0005983 0
.0006247 0.0006707 0.0006641 0.0006253 0
.0006087 0.0006234 0.0006807 0.0007485 0
.0007546 0.0007 0.000643 0.0006183 0
.0006264 0.0006819 0.000697 0.0006453 0
您首先需要定义块,我使用具有 chunk
功能的 BBmisc 来获取 N 个元素的块(在您的情况下为五个)。
然后你可以使用 write.table 有 append
选项。
library(BBmisc)
x <-list(1:20)
n<-5
splited<-chunk(x[[1]],n)
for(i in 1:length(splited)){
x=splited[[i]]
line=paste(x,collapse = "\t")
write.table(line, file = "output.txt", sep = "\t",
row.names = FALSE, col.names = FALSE, quote = FALSE, append = T)
}
此致
可以用cat
和gsub
来完成。 unlist
将 list
、paste
组合成一个字符串,在每个带空格的 'n' 数字块处插入下一行 (\n
),并使用 cat
写入控制台
cat(gsub("\s*((\d+\s+){1,4}\d+)", "\1\n",
paste(unlist(ls), collapse="\t")), '\n')
#1 2 3 4 5
#6 7 8 9 10
#11 12 13 14 15
#16 17 18 19 20
#21 22 23
或写入文件
cat(gsub("\s*((\d+\s+){1,4}\d+)", "\1\n",
paste(unlist(ls), collapse="\t")), '\n', file = 'file1.txt')
如果它是一个带有科学记数法等的复杂数据,我们可以将split
变成一个list
,然后在末尾附加NA
用于那些元素数量较少的元素
v1 <- unlist(ls)
lst1 <- split(v1, (seq_along(v1)-1) %/% 4 + 1)
mat1 <- do.call(rbind, lapply(lst1, `length<-`, max(lengths(lst1))))
write(mat1, 'file2.txt')