尝试write.table时未实现的类型列表

use*_*388 29 r dataframe write.table

我有以下data.table(data.frame)调用输出:

> 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
Run Code Online (Sandbox Code Playgroud)

我试图将其导出为CSV,如下所示:

> write.table(output, 'output.csv', sep = ',', row.names = FALSE, append = T)
Run Code Online (Sandbox Code Playgroud)

但是,这样做时我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

我已经尝试将其转换Title为字符串,以便它不再是list这样的类型:

toString(output$Title)
Run Code Online (Sandbox Code Playgroud)

但是,我得到了同样的错误.我的类型是:

> class(output)
[1] "data.frame"
> class(output$Id)
[1] "integer"
> class(output$Title)
[1] "list"
> class(output$IsProhibited)
[1] "factor"
Run Code Online (Sandbox Code Playgroud)

谁能告诉我如何将data.frame导出为CSV?

我注意到的另一个奇怪的事情是,如果我写的head(output)文本编码不正确(如上所示),而如果我只是写output$Title[0:3]它将正确显示文本,如下所示:

> output$Title[0:3]
[[1]]
[1] "Renault Logan, 2005"

[[2]]
[1] "????????? ?????????, 345 ?²"

[[3]]
[1] "??-???"
Run Code Online (Sandbox Code Playgroud)

关于那个的任何想法?它与我最初的问题有关吗?

编辑:这是我的新输出:

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   
Run Code Online (Sandbox Code Playgroud)

请注意线ID 10000395是如何搞砸的?它似乎包含了它自己的引用,它们搞乱了CSV.我该如何解决这个问题?

Sha*_*wal 22

这样做,无论您有多少列:

df <- apply(df,2,as.character)
Run Code Online (Sandbox Code Playgroud)

然后呢write.csv.

  • 为什么这有帮助?发生了什么以及如何解决它? (2认同)

A5C*_*2T1 21

正如评论中所提到的,你应该可以做这样的事情(未经测试)将你的"变平" list变成一个角色向量:

output$Title <- vapply(output$Title, paste, collapse = ", ", character(1L))
Run Code Online (Sandbox Code Playgroud)

如前所述,如果你想尝试这种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
Run Code Online (Sandbox Code Playgroud)

  • @user1477388,如果您这样做,请使用`dput(head(output))`,以便其他人可以准确地看到您正在使用的内容。 (2认同)

llr*_*lrs 14

data.table包中有一个新函数(在2016年11月引入),它可以很好地处理将data.table对象写入csv,即使在data.table列是列表的情况下也是如此.

fwrite(data.table, file ="myDT.csv")
Run Code Online (Sandbox Code Playgroud)


小智 7

另一种简单方案.也许一个或多个列是类型的list,因此我们需要将它们转换为"字符"或数据框.所以有两个简单的解决方案

  1. 使用 - 转换每列"as.character"

    df$col1 = as.character(df$col1)

    df$col2 = as.character(df$col2)

    .......等等

  2. 最好的转换df为"矩阵"

    df = as.matrix(df)

现在写入dfcsv.适合我.