在R中将列表导出为CSV或TXT文件

61

我明白如果其中一个元素是列表,我们就无法导出表格。我在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

在这里查看,对我很有效!https://stackoverflow.com/questions/64794619/exporting-large-lists-in-r-as-txt-or-csv/64802895#64802895 - Divna Djokic
8个回答

54

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

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

简单易懂!


5
如果文件太大,就无法完整捕获该文件。 - d2a2d
1
@d2a2d - 多大才算太大?我使用这种方法时没有遇到任何问题,但如果有限制,那么了解一下限制是很好的。 - EcologyTom
3
行数限制为10000行。也许有一种方法可以更改这个限制。 - d2a2d
2
从对?文件的粗略查看中,我无法在capture.output或全局选项中找到任何扩展限制的内容。如果其他人发现了什么,那就很好了解。希望这种方法对某些人仍然有用。 - EcologyTom

31
因此,您有一个列表的列表,其中“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)。 - KNN

10
使用 sink 函数:
sink("output.txt")
print(mylist)
sink()

2
如果列表包含大于10行的tbls,则每个tbl的第11行及以后的行将丢失: #...还有263行 - dez93_2000

6

1
如果列表包含大于10行的tbls,则每个tbl的第11行及以后的行将丢失: #...还有263行 - dez93_2000

4
你可以将列表简单地包装为数据框(实际上,数据框是一种特殊的列表)。以下是一个示例:
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) 两种方法。

为了帮助创建一个可重现的示例,你可以在数据上使用 dput 等函数。


非常感谢您的帮助。 - Ênio Rodrigues
5
如果列表中的所有元素拥有相同数量的行,我相信这个方法才能奏效。 - dez93_2000

3

我使用CPAN YAML包将列表导出成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

这很棒,正如你所说的那样,因为它结合了文件的可读性和进一步的使用。 - Tapper

0
你可以编写 For 循环来逐个从列表中存储数据框:
allocation = list()

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

0

这里有一种将列表写入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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接