Reputation: 416
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
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
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