Ich habe folgende data.table (data.frame) -Ausgabe:
> 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 so in eine CSV zu exportieren:
> write.table(output, 'output.csv', sep = ',', row.names = FALSE, append = T)
Dabei erhalte ich jedoch 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 habe versucht, die Variable Title
in eine Zeichenfolge umzuwandeln, so dass sie nicht mehr vom Typ list
ist.
toString(output$Title)
Aber ich bekomme den gleichen Fehler. Meine Typen sind:
> class(output)
[1] "data.frame"
> class(output$Id)
[1] "integer"
> class(output$Title)
[1] "list"
> class(output$IsProhibited)
[1] "factor"
Kann mir jemand sagen, wie ich mein data.frame nach CSV exportieren kann?
Eine andere merkwürdige Sache, die mir aufgefallen ist, ist, dass, wenn ich head(output)
schreibe, mein Text nicht richtig codiert ist (wie oben gezeigt), wenn ich jedoch einfach output$Title[0:3]
schreibe, wird er den Text richtig anzeigen:
> output$Title[0:3]
[[1]]
[1] "Renault Logan, 2005"
[[2]]
[1] "Складское помещение, 345 м²"
[[3]]
[1] "Су-шеф"
Irgendwelche Ideen dazu? Ist es 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 fehlerhaft ist. Es scheint eigene Zitate zu enthalten, die den CSV durcheinander bringen. Wie kann ich das beheben?
Wie in den Kommentaren erwähnt, sollten Sie in der Lage sein, so etwas (ungeprüft) zu machen, um Ihre list
in einen Zeichenvektor zu "glätten":
output$Title <- vapply(output$Title, paste, collapse = ", ", character(1L))
Wie auch erwähnt, wenn Sie den unlist
-Ansatz ausprobieren möchten, können Sie jede Zeile um die einzelnen Werte in output$Title
"erweitern", etwa wie folgt:
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
Tun Sie dies, unabhängig davon, wie viele Spalten Sie haben:
df <- apply(df,2,as.character)
Dann write.csv
.
Es gibt eine neue Funktion (eingeführt im November 2016) im data.table-Paket, die das Schreiben eines data.table-Objekts in csv sehr gut erledigt, selbst wenn eine Spalte der data.table eine Liste ist.
fwrite(data.table, file ="myDT.csv")
Eine weitere einfache Lösung. Möglicherweise sind eine oder mehrere Spalten vom Typ list
, daher müssen sie in "Zeichen" oder Datenrahmen konvertiert werden. Es gibt also zwei einfache Lösungen
Konvertieren Sie jede Spalte "as.character" mit--
df$col1 = as.character(df$col1)
df$col2 = as.character(df$col2)
.......und so weiter
Der beste konvertiert df
in eine "Matrix"
df = as.matrix(df)
schreiben Sie nun df
in csv. Funktioniert bei mir.
Angenommen,
der Pfad, unter dem Sie speichern möchten, ist Path
, d. h. path=Path
df
ist der Datenrahmen, den Sie speichern möchten,
folge diesen Schritten:
df
als txt document speichern:
write.table(df,"Path/df.txt",sep="|")
Lese die Textdatei in R:
Data = read.table("Path/df.txt",sep="|")
Speichern Sie jetzt als csv :
write.csv(Data, "Path/df.csv")
Das ist es.
Das sind alles elegante Lösungen.
Für den neugierigen Leser, der etwas R-Code den fertigen Paketen vorziehen würde, gibt es hier eine R-Funktion, die einen Datenrahmen ohne Liste zurückgibt, der als .csv exportiert und gespeichert werden kann.
ausgabe ist der fragliche "problematische" Datenrahmen.
df_unlist<-function(df){
df<-as.data.frame(df)
nr<-nrow(df)
c.names<-colnames(df)
lscols<-as.vector(which(apply(df,2,is.list)==TRUE))
if(length(lscols)!=0){
for(i in lscols){
temp<-as.vector(unlist(df[,i]))
if(length(temp)!=nr){
adj<-nr-length(temp)
temp<-c(rep(0,adj),temp)
}
df[,i]<-temp
} #end for
df<-as.data.frame(df)
colnames(df)<-c.names
}
return(df)
}
Wenden Sie die Funktion auf den Datenrahmen "Ausgabe" an:
newDF<-df_unlist(output)
Als Nächstes können Sie mit apply () bestätigen, dass der neue (newDF) -Datenrahmen nicht "aufgelistet" ist. Dies sollte erfolgreich FALSE zurückgeben.
apply(newDF,2,is.list) #2 for column-wise step.
Speichern Sie den neuen Datenrahmen newDF als CSV-Datei in einem Pfad Ihrer Wahl.
write.csv(newDF,"E:/Data/newDF.csv")