如何将列表中的数据保存到R中的文本文件?

时间:2015-04-08 03:22:31

标签: r csv

我有一个R对象实际上是一个列表

> str(snpset)
List of 16
$ chr1 : int [1:80] 2 6 7 8 11 13 16 17 18 21 ...
$ chr2 : int [1:78] 146 148 150 151 152 153 155 156 158 159 ...
$ chr3 : int [1:55] 276 279 281 284 289 295 298 301 304 306 ...
$ chr4 : int [1:66] 404 406 407 408 410 411 412 414 415 416 ...
$ chr5 : int [1:42] 505 506 508 509 511 514 515 516 518 521 ...
$ chr6 : int [1:38] 589 591 592 593 594 595 600 601 603 604 ...
$ chr7 : int [1:78] 660 663 664 665 666 671 673 677 679 681 ...
$ chr8 : int [1:69] 846 847 849 851 854 855 858 862 863 864 ...
$ chr9 : int [1:48] 968 969 970 971 972 974 980 981 982 983 ...
$ chr10: int [1:49] 1063 1066 1068 1069 1071 1072 1076 1077 1082 1083 ...
$ chr11: int [1:84] 1159 1160 1161 1162 1163 1164 1166 1169 1170 1172 ...
$ chr12: int [1:81] 1311 1313 1314 1315 1317 1318 1321 1323 1324 1326 ...
$ chr13: int [1:51] 1460 1461 1462 1464 1465 1466 1468 1469 1471 1472 ...
$ chr14: int [1:47] 1544 1546 1547 1548 1551 1552 1557 1559 1563 1564 ...
$ chr15: int [1:55] 1650 1651 1653 1654 1655 1657 1658 1659 1660 1661 ...
$ chr16: int [1:37] 1756 1757 1759 1761 1762 1763 1764 1767 1769 1770 ...

如何将对象中的所有数据“snpset”保存为文本文件?

我尝试了以下内容:

write.table(snpset,file="test",sep=" ", row.names=TRUE)

但得到了这个错误:

Error in data.frame(chr1 = c(2L, 6L, 7L, 8L, 11L, 13L, 16L, 17L, 18L, :
 arguments imply differing number of rows: 80, 78, 55, 66, 42, 38, 69, 48,
 49, 84, 81, 51, 47, 37 –

2 个答案:

答案 0 :(得分:4)

write.csv(以及整个write.函数族)接受data.frames和matrices,以及可以转换为这些类型结构的对象。列表不是它们的一部分(因为它们不是矩形将是一个简短的答案) - 因此错误消息。根据你想要做的,这里有两个解决方案(在许多其他可能的解决方案中)。

  1. 如果你只需要数据本身,用空格分隔,有或没有行号,cat就足够了:

    for(i in seq_along(snpset))
            cat(paste0(i,"."), snpset[[i]], "\n", file = "somefile.txt", append = TRUE)
    

    如果您不需要行号,请删除paste0(i,"."),

    文件内容(使用随机数据)

    1. 64 44 31 70 78 99 100 88 79 58 
    2. 43 155 105 151 190 177 192 108 168 110 
    3. 204 227 131 51 113 261 67 187 272 100 131 78 45 
    4. 45 259 400 64 127 70 186 213 197 101 220 
    5. 404 396 89 215 421 262 457 64 184 150 360 165 481 498 378 
    (...)
    
  2. 为了让您可以轻松地重读R的整个对象的文本表示,dput是一个不错的选择:

    dput(snpset, "someOtherFile.txt")
    

    然后把它带回R你会做

    snpset <- source("someOtherFile.txt")$value
    

    文件内容

    list(c(64L, 44L, 31L, 70L, 78L, 99L, 100L, 88L, 79L, 58L), c(43L, 
    155L, 105L, 151L, 190L, 177L, 192L, 108L, 168L, 110L), c(204L, 
    227L, 131L, 51L, 113L, 261L, 67L, 187L, 272L, 100L, 131L, 78L, 
    (...)
    

  3. 生成的数据

    snpset <- list()
    for(i in 1:10) {
        snpset[[i]] <- sample(c((i*10):(i*100)),size = sample(10:15, size = 1), replace=TRUE)
    }
    

答案 1 :(得分:3)

这是一个更简单的单行解决方案:

sapply(snpset, function(x) {write(paste(x, collapse=', '), file="output.txt",append=TRUE)})

或者如果你想让它更容易阅读:

sapply(snpset, function(x) {
                   write(paste(x, collapse=', '),
                   file="output.txt",append=TRUE)
               })

<强> output.txt的

2, 6, 7, 8, 11, 13, 16, 17, 18, 21, ...
146, 148, 150, 151, 152, 153, 155, 156, 158, 159, ...
276, 279, 281, 284, 289, 295, 298, 301, 304, 306, ...