Список невыполненных типов при попытке 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")