Search code examples
rgrouping

Collapse based on row names, but list all collapsed values


I have a data frame which I'd like to collapse based on row names, list all the values in a column (see below):

 name   value
 nameA  10
 nameA  3
 nameA  5
 nameB  5
 nameC  1
 nameC  44

I would like to generate this output:

 name   value
 nameA  10,3,5
 nameB  5
 nameC  1,44

Can I use aggregate() for this? similar way I sum the values in R?

sum <-aggregate(cbind(value) ~ name, data = x , FUN = sum )

Thanks!


Solution

  • Your expected output is not actually summing any values. Rather, you are concatenating them. You can use the c function in your aggregate call.

    aggregate(value ~ name, dat, c)
    #    name    value
    # 1 nameA 10, 3, 5
    # 2 nameB        5
    # 3 nameC    1, 44
    

    where dat is your data.

    You could also use paste, or toString (which is basically paste(..., collapse = ", ").

    aggregate(value ~ name, dat, toString)
    #    name    value
    # 1 nameA 10, 3, 5
    # 2 nameB        5
    # 3 nameC    1, 44
    aggregate(value ~ name, dat, paste, collapse = ",")
    #    name  value
    # 1 nameA 10,3,5
    # 2 nameB      5
    # 3 nameC   1,44
    

    Alternatively, you can use dplyr

    library(dplyr)
    group_by(dat, name) %>% summarize(value = toString(value))
    #    name    value
    # 1 nameA 10, 3, 5
    # 2 nameB        5
    # 3 nameC    1, 44