user2904120
user2904120

Reputation: 416

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!

Upvotes: 2

Views: 1279

Answers (2)

Rich Scriven
Rich Scriven

Reputation: 99331

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

Upvotes: 5

akrun
akrun

Reputation: 887128

You could try

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

Or using data.table

library(data.table)
setDT(df)[, list(value=list(value)), by=name]

Upvotes: 3

Related Questions