1. ホーム
  2. r

[解決済み] write.tableしようとすると、未実装の型リストが表示される。

2022-01-29 13:07:05

質問

以下のようなoutputという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

このように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   

行ID10000395がぐちゃぐちゃになっていることにお気づきでしょうか? それはそれ自身の引用符を含んでいるようで、CSVを台無しにしています。 どうしたら直せますか?

解決方法は?

コメントにもあるように、以下のようにすれば、quot;flatten" が得られるはずです(未検証)。 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