2012-05-24 13 views
14

Tengo un conjunto de datos relacionales, donde estoy buscando información diádica.Combinar filas dentro del marco de datos

Tengo 4 columnas. Remitente, Receptor, Atributo, Borde

Estoy buscando tomar los repetidos Recuentos Receptor - Receptor y convertirlos como bordes adicionales.

df <- data.frame(sender = c(1,1,1,1,3,5), receiver = c(1,2,2,2,4,5), 
       attribute = c(12,12,12,12,13,13), edge = c(0,1,1,1,1,0)) 

    sender receiver attribute edge 
1  1  1  12 0 
2  1  2  12 1 
3  1  2  12 1 
4  1  2  12 1 
5  3  4  13 1 

quiero que el resultado final se parezca a esto:

sender receiver attribute edge 
1  1  1  12 0 
2  1  2  12 3 
3  3  4  13 1 

Cuando la relación entre duplicados emisor-receptor se han combinado y el número de duplicados incorporados en el número de aristas.

Cualquier entrada sería muy apreciada.

Gracias!

Respuesta

6

plyr es su amigo, aunque creo que el resultado final no es del todo correcto dados los datos de entrada.

library(plyr) 

ddply(df, .(sender, receiver, attribute), summarize, edge = sum(edge)) 

devoluciones

sender receiver attribute edge 
1  1  1  12 0 
2  1  2  12 3 
3  3  4  13 1 
4  5  5  13 0 
+0

Creo que el OP no tenía la intención de agrupar por 'sender + receiver + attribute', sino simplemente por' sender + receiver', y 'attribute' va para el viaje. En el ejemplo, 'attribute' resulta ser único para los emparejamientos' sender + receiver', pero I * think * que fue accidental –

19

Para la diversión, aquí hay otras dos opciones, primero utilizando la función de base aggregate() y la segunda utilizando data.table paquete:

> aggregate(edge ~ sender + receiver + attribute, FUN = "sum", data = df) 
    sender receiver attribute edge 
1  1  1  12 0 
2  1  2  12 3 
3  3  4  13 1 
4  5  5  13 0 
> require(data.table) 
> dt <- data.table(df) 
> dt[, list(sumedge = sum(edge)), by = "sender, receiver, attribute"] 
    sender receiver attribute sumedge 
[1,]  1  1  12  0 
[2,]  1  2  12  3 
[3,]  3  4  13  1 
[4,]  5  5  13  0 

Para el registro, esta pregunta se ha preguntado muchas muchas veces, leyendo my own answers arroja varias respuestas que lo señalarían en el camino correcto.

+1

Cualquier respuesta que use solo funciones base siempre obtiene +1 de mi parte. – CCC

Cuestiones relacionadas