【问题标题】:Export a list into a CSV or TXT file in R将列表导出为 R 中的 CSV 或 TXT 文件
【发布时间】:2014-12-21 22:41:42
【问题描述】:

我了解,如果表格的元素之一是列表,我们将无法导出表格。我在 R 中有一个列表,我想将其导出为 CSV 或 TXT 文件。这是我执行此write.table 命令时收到的错误消息:

write.table(mylist,"test.txt",sep=";")

Error in .External2(C_writetable, x, file, nrow(x), p, rnames, sep, eol,  : 
unimplemented type 'list' in 'EncodeElement'

这是我列表的第一个元素:

$f10010_1
$f10010_1$mots
 [1] X16               ESPRESSO          TDISC             TASSIMO          
 [5] CARTE             NOIRE             A                 LAVAZZA          
 [9] MALONGO           MIO               MODO              123              
[13] CAPSULES          DOSES             78G               LONG             
[17] SPRESSO           CAFE              120G              CLASSIC          
[21] 104G              128G              AROMATIQUE        INTENSE          
[25] 112G              156G              520G              5X16             
[29] PROMO             TRIPACK           X24               126G             
[33] 16                4X16              APPASSIONATAMENTE APPASSIONATEMENTE
[37] BRESIL            CAPSUL            COLOMBIE          CORSE            
[41] CREMOSAMENTE      DELICATI          DELIZIOSAMENTE    DIVINAMENTE      
[45] DOLCEMENTE        EQI               GRAND             GRANDE           
[49] GT                GUATEMALA         HAITI             INTENSAMENTE     
[53] ITALIAN           MAGICAMENTE       MERE              MOKA78G          
[57] PETITS            PRODUCT           PURSMATIN         RESERVE          
[61] RISTRETO          SOAVEMENTE        STYLE             X36              
64 Levels: 104G 112G 120G 123 126G 128G 156G 16 4X16 520G 5X16 78G ... X36

$f10010_1$nblabel
 [1] 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
[27] 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
[53] 32 32 32 32 32 32 32 32 32 32 32 32
Levels: 32

$f10010_1$Freq
 [1] 18 16 16 15 14 14  9  9  9  9  9  8  8  8  7  7  7  6  5  5  3  3  3  3  2  2
[27]  2  2  2  2  2  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
[53]  1  1  1  1  1  1  1  1  1  1  1  1

$f10010_1$pct
 [1] 0.56250 0.50000 0.50000 0.46875 0.43750 0.43750 0.28125 0.28125 0.28125
[10] 0.28125 0.28125 0.25000 0.25000 0.25000 0.21875 0.21875 0.21875 0.18750
[19] 0.15625 0.15625 0.09375 0.09375 0.09375 0.09375 0.06250 0.06250 0.06250
[28] 0.06250 0.06250 0.06250 0.06250 0.03125 0.03125 0.03125 0.03125 0.03125
[37] 0.03125 0.03125 0.03125 0.03125 0.03125 0.03125 0.03125 0.03125 0.03125
[46] 0.03125 0.03125 0.03125 0.03125 0.03125 0.03125 0.03125 0.03125 0.03125
[55] 0.03125 0.03125 0.03125 0.03125 0.03125 0.03125 0.03125 0.03125 0.03125
[64] 0.03125

【问题讨论】:

标签: r


【解决方案1】:

我认为最直接的方法是使用capture.output,因此;

capture.output(summary(mylist), file = "My New File.txt")

简单!

【讨论】:

  • 如果文件很大,则不会捕获完整的文件
  • @d2a2d - 多大才算太大?使用这种方法我没有遇到任何问题,但是如果有限制,那么最好知道它们是什么。
  • 10000 行是限制。也许有办法改变这一点
  • 粗略查看? 文件,我在capture.output 或用于扩展限制的全局选项中看不到任何内容。如果其他人发现了什么,很高兴知道。希望该方法对某些人仍然有用。
【解决方案2】:

所以基本上你有一个列表列表,其中 mylist 是主列表的名称,第一个元素是 $f10010_1,它被打印出来(其中包含另外 4 个列表)。

我认为最简单的方法是使用lapply加上dataframe(假设主列表的每个元素内的每个列表(如$f10010_1中的列表)具有相同的长度) :

lapply(mylist, function(x) write.table( data.frame(x), 'test.csv'  , append= T, sep=',' ))

以上内容会将$f10010_1 转换为数据框,然后对所有其他元素执行相同操作,并在“test.csv”中将一个附加到另一个下方

您还可以在控制台上键入 ?write.table 以检查在将表格写入 csv 文件时需要传递的其他参数,例如是否需要行名或列名等。

【讨论】:

  • 这样做的一个缺点是不保留列表名称(即 f10010_1$mots)
【解决方案3】:

使用sink函数:

sink("output.txt")
print(mylist)
sink()

【讨论】:

  • 如果列表包含大于 10 行的 tbl,则每行 11+ 将丢失:# ... 还有 263 行
【解决方案4】:

cat(capture.output(print(my.list), file="test.txt"))

来自R: Export and import a list to .txt file https://stackoverflow.com/users/1855677/42 是唯一对我有用的东西。这会输出文本文件中的列表列表

【讨论】:

  • 如果列表包含大于 10 行的 tbl,则每行的第 11+ 行将丢失:# ... 还有 263 行
【解决方案5】:

我使用 CPAN YAML package 将列表导出为 YAML 格式。

l <- list(a="1", b=1, c=list(a="1", b=1))
yaml::write_yaml(l, "list.yaml")

YAML 的好处是它是一种人类可读的文本格式,因此易于阅读/共享/导入/等

$ cat list.yaml
a: '1'
b: 1.0
c:
  a: '1'
  b: 1.0

【讨论】:

  • 这很棒,正如你所说,因为它结合了文件的可读性和进一步使用
【解决方案6】:

您可以简单地将列表包装为 data.frame(data.frame 实际上是一种特殊的列表)。这是一个例子:

mylist = list() 
mylist[["a"]] = 1:10 
mylist[["b"]] = letters[1:10]
write.table(as.data.frame(mylist),file="mylist.csv", quote=F,sep=",",row.names=F)

或者您也可以使用 write.csv(write.table 的包装器)。对于列表的转换,可以同时使用as.data.frame(mylist)data.frame(mylist)

为了帮助创建reproducible example,您可以在数据上使用dput 之类的函数。

【讨论】:

  • 非常感谢您的帮助。
  • 我相信这只有在所有列表元素的行数相同时才有效
【解决方案7】:

您可以编写 For 循环来单独存储列表中的数据帧:

allocation = list()

for(i in 1:length(allocation)){
    write.csv(data.frame(allocation[[i]]), file = paste0(path, names(allocation)[i], '.csv'))
}

【讨论】:

    【解决方案8】:

    这是将列表写入 csv 或其他格式文件的一种方法:

    输入列表:

    test <- list(A=data.frame(m=1:3,n=letters[1:3]), B=1:5)
    

    将列表导出到文件:

    library(data.table)
    outputfile <- "test.csv" #output file name
    sep <- "," #define the separator (related to format of the output file)
    for(nam in names(test)){
      fwrite(list(nam), file=outputfile, sep=sep, append=T) #write names of the list elements
      ele <- test[[nam]]
      if(is.list(ele)) fwrite(ele, file=outputfile, sep=sep, append=T, col.names=T) else fwrite(data.frame(matrix(ele, nrow=1)), file=outputfile, append=T) #write elements of the list
      fwrite(list(NA), file=outputfile, append=T) #add an empty row to separate elements
    }
    

    输出如下(由于级别限制,我无法在此处放图片):

    A
    m,n
    1,a
    2,b
    3,c
    
    B
    1,2,3,4,5
    

    【讨论】:

      猜你喜欢
      • 2015-11-04
      • 2015-02-09
      • 1970-01-01
      • 2022-06-16
      • 2015-04-14
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      相关资源
      最近更新 更多