2015-01-06 9 views
5

Abtastdaten erstellen:eine Spalte von Listen in eine Zeichenkette in einem R-Datenrahmen Nötigung

id <- c(12, 32, 42, 42, 52, 52, 67, 67) 
relationship_id <- c(15,1,59,1,61,6,59,1) 
sample.data <- data.frame(id,relationship_id) 

für jede ID, die mehr als einmal, verketten die relationship_id erscheint:

combo <- aggregate(relationship_id ~ id, data = sample.data, paste, sep=",") 
table(combo$relationship_id) 
Error in table(combo$relationship_id) : 
    all arguments must have the same length 

I heraus Was hat diesen Fehler verursacht:

class(combo$relationship_id) 
[1] "list" 

Aber wenn ich versuche und den Vektor der Liste zu einem Zeichenvektor zwingen:

combo["relationship_id"] <- lapply(combo["relationship_id"], as.character) 
> head(combo)  
    id relationship_id 
1 12    15 
2 32    1 
3 42 c("59", "1") 
4 52 c("61", "6") 
5 67 c("59", "1") 

Es die Verkettung Syntax enthält ... Ich verstehe, dass ich die Ausgabe analysieren kann, so dass es verwendet werden kann, aber warum ist das passiert? Gibt es eine einfachere Möglichkeit, die Ausgabe zu bereinigen?

+0

Ändern Sie 'sep' in' collapse' und Sie sollten in der Lage sein zu tun, was Sie erwartet haben. – A5C1D2H2I1M1N2O1R2T1

+1

Gute Arbeit mit einer reproduzierbaren Frage als Ihre erste Frage zu SO. (+1) – A5C1D2H2I1M1N2O1R2T1

Antwort

4

Sie versuchen, das falsche Problem anzugehen. Wenn Sie diese Werte wirklich in einen einzelnen Zeichenvektor reduzieren möchten, sollten Sie collapse = "," anstelle von sep verwenden.

combo <- aggregate(relationship_id ~ id, data = sample.data, 
        paste, collapse=",") 
table(combo$relationship_id) 
# 
# 1 15 59,1 61,6 
# 1 1 2 1 
+0

Ich mag 'ToString' für solche Fälle. –

+0

Ich finde "Paste", um transparenter und weit verbreitet zu sein, aber ich denke, es ist eine Frage der Präferenz. – A5C1D2H2I1M1N2O1R2T1

Verwandte Themen