wake-up-neo.com

Liste nicht implementierter Typen beim Versuch, write.table zu schreiben

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?

26
user1477388

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
19

Tun Sie dies, unabhängig davon, wie viele Spalten Sie haben:

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

Dann write.csv.

17

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")
9
llrs

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

  1. Konvertieren Sie jede Spalte "as.character" mit--

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

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

    .......und so weiter

  2. Der beste konvertiert df in eine "Matrix"

    df = as.matrix(df)

schreiben Sie nun df in csv. Funktioniert bei mir.

7
Ravi kumar

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:

  1. df als txt document speichern:

    write.table(df,"Path/df.txt",sep="|")
    
  2. Lese die Textdatei in R:

    Data = read.table("Path/df.txt",sep="|")
    
  3. Speichern Sie jetzt als csv :

    write.csv(Data, "Path/df.csv")
    

Das ist es.

1
K.Pascal

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")
0
K.Pascal