将列表导出到R中的CSV或TXT文件中

时间:2014-12-21 22:41:43

标签: r export

我很抱歉地问这个问题。我和R非常相似。我知道有很多线程与同一个问题有关。我知道如果其中一个元素是一个列表,我们就无法导出表格,但我没有设法解决我的问题。所以,我在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

提前感谢大家的帮助!

9 个答案:

答案 0 :(得分:32)

我认为大多数直截了当的方法是使用capture.output,因此;

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

容易!

答案 1 :(得分:16)

所以基本上你有一个列表列表,其中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文件时需要传递的其他参数,例如是否需要行名称或列名等。

答案 2 :(得分:3)

您可以简单地将列表包装为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等功能。

答案 3 :(得分:2)

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

来自R: Export and import a list to .txt file https://stackoverflow.com/users/1855677/42

是唯一对我有用的东西。这将输出文本文件中的列表列表

答案 4 :(得分:2)

使用perl -e '$SIG{PIPE} = sub { print STDERR "XXX\n"; }; sleep(1); print "foo\n";' | echo -n函数:

sink

答案 5 :(得分:2)

我使用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 :(得分:0)

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

allocation = list()

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

答案 7 :(得分:0)

在这里签出,对我来说效果很好,输出大小没有限制,没有遗漏的元素,甚至超过了1000

Exporting large lists in R as .txt or .csv

答案 8 :(得分: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