r语言 - 如何在 data.table 上使用 sep2 = " "



是否有一种方法可以使用data.table::fwrite来编写列的值而不需要它们之间的任何分离?

例如:

library("data.table")
geno <- data.table(
IID = 1:10,
SNP = lapply(1:10, function(i) sample(0:2, 10, replace = TRUE))
)
fwrite(geno, "Geno.txt", col.names = FALSE, sep = " ", sep2 = c("","",""))

但是sep2不允许,并给了我以下错误:

Error in fwrite(geno, "Geno.txt", col.names = FALSE, row.names = FALSE,  : 
is.character(sep2) && length(sep2) == 3L && nchar(sep2[2L]) ==  .... is not TRUE

我希望得到以下结果,而不必在将其写入文件之前折叠所有值。

1 2221210202
2 0020010221
3 1010022212
4 0120121221
5 1212211202
6 2100002010
7 1110011210
8 1212012121
9 2221121021
10 1122220101

谢谢。

根据?fwrite, sep2[2]必须为单个字符。因此,您必须折叠列表,而不是使用sep2。

可以使用

fwrite(geno[, .(IID, SNP=sapply(SNP, paste0, collapse=''))], 'test.txt', sep=' ')

备选方案:使用已知数据中不存在的字符编写,然后以编程方式从文件中删除该字符。这里的第二步可以在R中完成,但坦率地说,命令行工具在这方面要快得多。这里我将使用tr,因为它可能是最快的。

fwrite(geno, "Geno.txt", col.names = FALSE, sep = " ", sep2 = c("","37",""))
readLines("Geno.txt", n=2)
# [1] "1 1372371372372370371370372370" "2 1370372372371370372372371370"
system2("tr", c("-d", "37"), stdin="Geno.txt", stdout="Geno2.txt")
readLines("Geno2.txt", n=2)
# [1] "1 1212201020" "2 1022102210"

tr应该在所有类unix操作系统(包括MacOS)上可用,并且在Rtools-4.0中,在"c:\rtools40\usr\bin\tr.exe"或最接近您安装的路径下可用。

为此,我选择了unicode37,它被许多东西用作"分隔符",并且似乎不太可能在大多数数据集中找到。然而,其他的也可以很容易地工作,包括sep2 = c("", "|", "")"system2(tr", c("-d", "|"), ...)

相关内容

  • 没有找到相关文章

最新更新