Экспортировать список в файл CSV или TXT в R
Прошу прощения за этот вопрос. Я очень люблю с 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
Спасибо всем за вашу помощь заранее!
Ответы
Ответ 1
Итак, у вас есть список списков, в котором 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
Я думаю, что самый простой способ сделать это - использовать capture.output
, таким образом;
capture.output(summary(mylist), file = "My New File.txt")
Легко!
Ответ 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)
.
Чтобы помочь в создании воспроизводимого примера, вы можете использовать для своих функций такие функции, как dput
.
Ответ 4
cat(capture.output(print(my.list), file="test.txt")
from R: экспортировать и импортировать список в файл .txt https://stackoverflow.com/users/1855677/42 - это единственное это сработало для меня.