2014-07-18 14 views
17

write.table Ich habe folgendes data.table (data.frame) genannt Ausgabe:Unimplemented Typenliste, wenn sie versuchen

> 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 

Ich versuche, es in eine CSV-Export in etwa so:

> write.table(output, 'output.csv', sep = ',', row.names = FALSE, append = T) 

wenn jedoch dabei bekomme ich folgende Fehlermeldung:

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 

ich versucht habe, die Title zu einem strin Umwandlung g, so dass es nicht mehr vom Typ list wie so:

toString(output$Title) 

Aber ich den gleichen Fehler. Meine Typen sind:

Kann mir jemand sagen, wie ich mein data.frame zu CSV exportieren kann?

Eine weitere seltsame Sache, die ich bemerkt habe, ist, dass, wenn ich head(output) mein Text schreibe nicht richtig codiert ist (wie oben gezeigt), während, wenn ich einfach output$Title[0:3] schreibe sie den Text wie so richtig angezeigt werden:

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

[[2]] 
[1] "Складское помещение, 345 м²" 

[[3]] 
[1] "Су-шеф" 

Irgendwelche Ideen dazu? Ist das für mein anfängliches Problem relevant?

Edit: Hier ist meine neue Ausgabe:

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 

Beachten Sie, wie die Zeilen-ID 10000395 ist durcheinander? Es scheint eigene Zitate zu enthalten, die die CSV in Unordnung bringen. Wie kann ich das beheben?

+1

Mit 'Einfügen' die Spalte' list' abflachen und es erneut versuchen. – A5C1D2H2I1M1N2O1R2T1

+2

Sieht aus wie 'unlist (output)' kann auch eine Option sein. – user1477388

+1

Ich sehe nicht 'unlist 'als eine Option hier. Sie können diese Werte aufheben und erweitern, um neue Zeilen zu trennen und alle anderen Spalten nach Bedarf zu duplizieren. – A5C1D2H2I1M1N2O1R2T1

Antwort

15

Wie in den Kommentaren erwähnt, sollten Sie in der Lage sein, so etwas wie dieses (nicht getestet) zu tun bekommen „abzuflachen“ Ihr list in einen Zeichenvektor:

output$Title <- vapply(output$Title, paste, collapse = ", ", character(1L)) 

Wie auch erwähnt, wenn Sie versuchen wollte die unlist Ansatz, könnten Sie „erweitern“ jede Zeile durch die einzelnen Werte in output$Title, etwa so:

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 
+0

Ich bin nicht sicher, wie man die Resultate erklärt - im Grunde sind sie unerwartet. Wenn ich nach CSV ausgabe, erstellt es wie 100+ Spalten (ich erwarte nur 3 Spalten). Auch wenn ich 'head (output)' mache, gibt es eine Menge Daten aus (fast friert RStudio). – user1477388

+0

@ user1477388, Ups. Ich meinte 'vapply' nicht' do.call'. Deshalb sollten Sie immer ein minimal reproduzierbares Beispiel veröffentlichen! – A5C1D2H2I1M1N2O1R2T1

+1

@ user1477388, 'vapply' ist wie Ihr' sapply' Ansatz, der auch funktionieren sollte, wenn Sie den 'collapse =", "' Teil hinzufügen. – A5C1D2H2I1M1N2O1R2T1

6

weitere einfache Lösung. Vielleicht sind eine oder mehrere Spalten vom Typ list, also müssen wir sie in "Zeichen" oder Datenrahmen konvertieren. So gibt es zwei einfache Lösungen

  1. konvertieren jede Spalte "as.character" using--

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

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

    .......und so weiter

  2. Die beste convert df in eine "Matrix"

    df = as.matrix(df)

jetzt df in csv schreiben. Funktioniert bei mir.

+1

Ihre zweite Lösung funktioniert für mich ....... – Deepesh

7

dies tun, und zwar unabhängig davon, wie viele Spalten Sie haben:

df <- apply(df,2,as.character) 

Dann write.csv tun.

2

Es gibt eine neue Funktion (eingeführt im November 2016) im data.table-Paket, das das Schreiben eines data.table-Objekts in csv recht gut handhabt, selbst in den Fällen, in denen eine Spalte der data.table eine Liste ist.

fwrite(data.table, file ="myDT.csv") 
Verwandte Themen