2015-01-06 15 views
5

Crea dati di esempio:costringere una colonna di liste in una stringa in un frame di dati R

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) 

per ogni ID che appare più di una volta, concatenare il relationship_id:

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 

ho capito che cosa ha causato questo errore:

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

Ma quando provo a forzare il vettore di elenco a un vettore di caratteri:

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

Esso comprende la sintassi di concatenazione ... ho capito che posso analizzare l'output in modo che sia utilizzabile, ma perché sta succedendo questo? C'è un modo più semplice per ripulire l'output?

+0

Modifica 'sep' to' collapse' e ​​dovresti essere in grado di fare ciò che ti aspettavi. – A5C1D2H2I1M1N2O1R2T1

+1

Bel lavoro con una domanda riproducibile come prima domanda su SO. (+1) – A5C1D2H2I1M1N2O1R2T1

risposta

4

Stai provando ad affrontare il problema sbagliato. Se si desidera veramente comprimere tali valori in un vettore a carattere singolo, è necessario utilizzare collapse = "," anziché sep.

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

Mi piace 'toString' per questi casi. –

+0

Trovo che 'paste' sia più trasparente e più utilizzato, ma suppongo che sia una questione di preferenza. – A5C1D2H2I1M1N2O1R2T1

Problemi correlati