Список невыполненных типов при попытке write.table
У меня есть следующий data.table(data.frame), называемый output:
> head(output)
Id Title IsProhibited
1 10000074 Renault Logan, 2005 0
2 10000124 Ñêëàäñêîå ïîìåùåíèå, 345 ì<U+00B2> 0
3 10000175 Ñó-øåô 0
4 10000196 3-ê êâàðòèðà, 64 ì<U+00B2>, 3/5 ýò. 0
5 10000387 Samsung galaxy S4 mini GT-I9190 (÷¸ðíûé) 0
6 10000395 Êàðòèíà ""Êðûì. Ïîñåëîê Àðîìàò"" (õîëñò, ìàñëî) 0
Я пытаюсь экспортировать его в CSV, например:
> write.table(output, 'output.csv', sep = ',', row.names = FALSE, append = T)
Однако при этом я получаю следующую ошибку:
Error in .External2(C_writetable, x, file, nrow(x), p, rnames, sep, eol, :
unimplemented type 'list' in 'EncodeElement'
In addition: Warning message:
In write.table(output, "output.csv", sep = ",", row.names = FALSE, :
appending column names to file
Я попытался преобразовать Title
в строку так, чтобы она больше не имела типа list
:
toString(output$Title)
Но я получаю ту же ошибку. Мои типы:
> class(output)
[1] "data.frame"
> class(output$Id)
[1] "integer"
> class(output$Title)
[1] "list"
> class(output$IsProhibited)
[1] "factor"
Может ли кто-нибудь сказать мне, как я могу экспортировать свой файл data.frame в CSV?
Еще одна странная вещь, которую я заметил, состоит в том, что, если я пишу head(output)
, мой текст неправильно закодирован (как показано выше), тогда как если бы я просто написал output$Title[0:3]
, он правильно отобразил текст так:
> output$Title[0:3]
[[1]]
[1] "Renault Logan, 2005"
[[2]]
[1] "Складское помещение, 345 м²"
[[3]]
[1] "Су-шеф"
Любые идеи относительно этого? Является ли это актуальным для моей первоначальной проблемы?
Изменить: Вот мой новый результат:
Id Title IsProhibited
10000074 Renault Logan, 2005 0
10000124 СкладÑкое помещение, 345 м<U+00B2> 0
10000175 Су-шеф 0
10000196 3-к квартира, 64 м<U+00B2>, 3/5 ÑÑ‚. 0
10000387 Samsung galaxy S4 mini GT-I9190 (чёрный) 0
10000395 Картина \\"Крым. ПоÑелок Ðромат\"\" (холÑÑ‚ маÑло)" 0
10000594 КальÑн 25 Ñм 0
10000612 1-к квартира, 45 м<U+00B2>, 6/17 ÑÑ‚. 0
10000816 Ð"араж, 18 м<U+00B2> 0
10000831 Платье 0
10000930 Карбюраторы К-22И, К-22Ð" от газ 21 и газ 51 0
Обратите внимание, что строка ID 10000395 перепутана? Кажется, что он содержит собственные кавычки, которые испортили CSV. Как я могу это исправить?
Ответы
Ответ 1
Как уже упоминалось в комментариях, вы должны сделать что-то вроде этого (непроверенное), чтобы получить "сгладить" ваш list
в вектор символов:
output$Title <- vapply(output$Title, paste, collapse = ", ", character(1L))
Как уже упоминалось, если вы хотите попробовать подход unlist
, вы можете "развернуть" каждую строку по отдельным значениям в output$Title
, примерно так:
x <- vapply(output$Title, length, 1L) ## How many items per list element
output <- output[rep(rownames(output), x), ] ## Expand the data frame
output$Title <- unlist(output$Title, use.names = FALSE) ## Replace with raw values
Ответ 2
Сделайте это, независимо от того, сколько столбцов у вас есть:
df <- apply(df,2,as.character)
Тогда do write.csv
.
Ответ 3
Еще одно простое решение. Возможно, один или несколько столбцов имеют тип list
, поэтому нам нужно преобразовать их в "символ" или в фрейм данных. Итак, есть два простых решения
-
Преобразуйте каждый столбец "as.character" с помощью -
df$col1 = as.character(df$col1)
df$col2 = as.character(df$col2)
....... и т.д.
-
Лучший конвертировать df
в "матрицу"
df = as.matrix(df)
теперь напишите df
в csv. Работает для меня.
Ответ 4
В пакете data.table появилась новая функция (введенная в ноябре 2016 г.), которая обрабатывает объект data.table в csv довольно хорошо, даже в тех случаях, когда столбец data.table представляет собой список.
fwrite(data.table, file ="myDT.csv")