2017-05-16 3 views
0

Angenommen Entadressierung habe ich einen Datenrahmen DF genannt:Fehler beim Spalten in einem Datenrahmen

options(stringsAsFactors = F) 

letters <- list("A", "B", "C", "D") 
numbers <- list(list(1,2), 1, 1, 2) 
score <- list(.44, .54, .21, .102) 

DF <- data.frame(cbind(letters, numbers, score)) 

Beachten Sie, dass alle Spalten in dem Datenrahmen der Klasse sind „Liste“.

Werfen Sie auch einen Blick auf die Struktur: DF $ Zahlen [1] ist auch eine Liste

Ich versuche, jede Spalte fehlenden oder.

DF$letters <- unlist(DF$letters) 
DF$score <- unlist(DF$score) 
DF$numbers <- unlist(DF$numbers) 

Da jedoch, DF $ Zahlen [1] auch eine Liste ist, bin ich zurückgeworfen dieser Fehler:

Error in `$<-.data.frame`(`*tmp*`, numbers, value = c(1, 2, 1, 1, 2)) : 
    replacement has 5 rows, data has 4 

Gibt es eine Möglichkeit, dass ich die ganze Spalte fehlenden oder kann, und Halten Sie die Werte Zellen wie DF $ Zahlen [1] als Zeichenvektor wie c (1,2) oder 1,2?

Im Idealfall würde Ich mag DF, so etwas zu sehen, wobei die einzelnen Werte in den Nummernspalt noch vom Typ int sind:

letters numbers score 
    A   1,2  .44 
    B   1   .54 
    C   1   .21 
    D   2   .102 

Ziel ist es, dann zu einer csv des Datenrahmen zu schreiben Datei.

Antwort

1

Sie unlist auf jedes einzelne Element der Spalte anwenden können Zahlen statt die gesamte Spalte:

DF$numbers <- lapply(DF$numbers, unlist) 

DF 
# letters numbers value 
#1  A 1, 2 0.440 
#2  B  1 0.540 
#3  C  1 0.210 
#4  D  2 0.102 

DF$numbers[1] 
#[[1]] 
#[1] 1 2 

Oder die Elemente als einzelne Zeichenfolge einfügen, wenn Sie eine Atom Vektor Spalte wollen:

DF$numbers <- sapply(DF$numbers, toString) 
DF 
# letters numbers value 
#1  A 1, 2 0.44 
#2  B  1 0.54 
#3  C  1 0.21 
#4  D  2 0.102 

DF$numbers[1] 
#[1] "1, 2" 

class(DF$numbers) 
# [1] "character" 
+0

Hallo! Das ist ein guter Tipp, aber DF $ Zahlen sind immer noch im Listenformat. Wenn ich versuche, unlist() die DF $ Nummern <- unlist (lapply (DF $ numbers, unlist)), werde ich den gleichen Fehler zurückgeworfen, den ich in meinem ursprünglichen Beitrag beschrieben habe – Sheila

+0

Die * Zahlen * Spalte wird Liste wenn die Elemente enthalten Vektor wie 'c (1,2)'. Wenn Sie nicht wollen, dass es eine Liste ist, können Sie die Elemente als String als 'DF $ numbers <- sapply (DF $ numbers, toString)' einfügen. – Psidom

+0

Ich sehe, Ja, ich möchte die Elemente der Liste vom Typ int sein. Wenn ich versuche, DF mit write.csv zu schreiben, werde ich den Fehler "Write.table (DF, test.csv", col.names = NA, sep = "," , dec = ".",: nicht implementierter Typ 'list' in 'EncodeElement' " – Sheila

0

können Sie tun:

DF$letters <- unlist(DF$letters) 
DF$value <- unlist(DF$value) 
DF$numbers <- unlist(as.character(DF$numbers)) 

Dies gibt:

DF 
    letters numbers value 
1  A c(1, 2) 0.440 
2  B  1 0.540 
3  C  1 0.210 
4  D  2 0.102 
Verwandte Themen