1

I have a dataframe df that looks like the following:

df<-structure(list(hex = c(7L, 7L, 5L, 7L, 5L, 5L, 5L, 3L, 5L, 7L
), material_diff = list(c(0, 0, -1, 0, 0, 0), c(0, 0, -1, 0, 
0, 0), c(0, 0, -1, 0, 0, 0), c(0, 0, -1, 0, 0, 0), c(0, 0, -1, 
0, 0, 0), c(0, 0, -1, 0, 0, 0), c(0, 0, -1, 0, 0, 0), c(0, 0, 
0, 0, -0.166666666666667, 0), c(0, 0, -1, 0, 0, 0), c(0, 0, -1, 
0, 0, 0))), class = "data.frame", row.names = c(NA, -10L))

   hex                                                     material_diff
1    7                                                 0, 0, -1, 0, 0, 0
2    7                                                 0, 0, -1, 0, 0, 0
3    5                                                 0, 0, -1, 0, 0, 0
4    7                                                 0, 0, -1, 0, 0, 0
5    5                                                 0, 0, -1, 0, 0, 0
6    5                                                 0, 0, -1, 0, 0, 0
7    5                                                 0, 0, -1, 0, 0, 0
8    3 0.0000000, 0.0000000, 0.0000000, 0.0000000, -0.1666667, 0.0000000
9    5                                                 0, 0, -1, 0, 0, 0
10   7                                                 0, 0, -1, 0, 0, 0

I want to sum the vectors in material_diff and group by hex to return the following:

   hex                                                     material_diff
1    3   0.0000000, 0.0000000, 0.0000000, 0.0000000, -0.1666667, 0.0000000
2    5                                                 0, 0, -5, 0, 0, 0
3    7                                                 0, 0, -4, 0, 0, 0

How might achieve this?

2 Answers 2

4

You may take help of Reduce -

library(dplyr)

df %>%
  group_by(hex) %>%
  summarise(material_diff = list(Reduce(`+`, material_diff))) %>%
  data.frame() #for better viewing. 

#  hex                                                     material_diff
#1   3 0.0000000, 0.0000000, 0.0000000, 0.0000000, -0.1666667, 0.0000000
#2   5                                                 0, 0, -5, 0, 0, 0
#3   7                                                 0, 0, -4, 0, 0, 0
Sign up to request clarification or add additional context in comments.

Comments

0

Here is a base R way with by.

res <- data.frame(hex = sort(unique(df$hex)))
res$material_diff <- by(seq_along(df$material_diff), df$hex, \(i) {
  x <- do.call(rbind, df$material_diff[i])
  colSums(x)
})
res
#  hex                                                     material_diff
#1   3 0.0000000, 0.0000000, 0.0000000, 0.0000000, -0.1666667, 0.0000000
#2   5                                                 0, 0, -5, 0, 0, 0
#3   7                                                 0, 0, -4, 0, 0, 0

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.