Andrew Hamel
Andrew Hamel

Reputation: 366

Sum of individual elements in a vector

I would like to determine the sum for each individual element in a vector.

For example, suppose I have the vector

x <- c(2,3,2,2,5,5,3,3)

and I want to find the sum for each element.

The answer would be something like

2: 6
3: 9
5: 10

This is because there are three 2's (2+2+2 or 2*), etc.

In other words, I want to essentially multiply the number times the number of times that element is found in the vector.

Upvotes: 1

Views: 1031

Answers (5)

akrun
akrun

Reputation: 887118

We can use rowsum from base R

rowsum(x, group = x)
#    [,1]
#2    6
#3    9
#5   10

Or with by

by(x, x, FUN = sum)

Or with split

sapply(split(x, x), sum)
#  2  3  5 
#  6  9 10 

Or another option with xtabs

xtabs(x1 ~ x, cbind(x1 = x, x))
#  2  3  5 
#  6  9 10 

Or with ave

unique(data.frame(x, Sum = ave(x, x, FUN = sum)))
#   x Sum
#1 2   6
#2 3   9
#5 5  10

Or using data.table

library(data.table)
data.table(grp = x, x=x)[, .(Sum = sum(x)), grp]
#   grp Sum
#1:   2   6
#2:   3   9
#3:   5  10

Upvotes: 1

Ronak Shah
Ronak Shah

Reputation: 388982

Using base R tapply

tapply(x, x, sum)
# 2  3  5 
# 6  9 10 

If you need it as dataframe wrap it in stack

stack(tapply(x, x, sum))

#  values ind
#1      6   2
#2      9   3
#3     10   5

If you convert this to a dataframe then this becomes (How to sum a variable by group)

library(dplyr)
tibble::tibble(x) %>%
   group_by(x) %>%
   summarise(n = sum(x))

# A tibble: 3 x 2
#      x     n
#  <dbl> <dbl>
#1     2     6
#2     3     9
#3     5    10

Upvotes: 3

Marcio Rodrigues
Marcio Rodrigues

Reputation: 339

library(tidyverse)

x <- c(2,3,2,2,5,5,3,3)
tibble(x) %>% 
count(x) %>% 
mutate(xn = x*n ) %>% 
pull(xn)

Upvotes: 1

lroha
lroha

Reputation: 34441

Lots of ways to do this. A couple of base approaches:

with(rle(sort(x)), data.frame(val = values, freq = lengths, prod = lengths*values))

  val freq prod
1   2    3    6
2   3    3    9
3   5    2   10

Or:

transform(as.data.frame(table(x), stringsAsFactors = FALSE), sum = as.numeric(x) * Freq)

  x Freq sum
1 2    3   6
2 3    3   9
3 5    2  10

Upvotes: 2

liuminzhao
liuminzhao

Reputation: 2455

A method with dplyr:

x <- c(2,3,2,2,5,5,3,3)

a = tibble(x)

a %>% count(x) %>% mutate(xn = x*n)

# A tibble: 3 x 3
      x     n    xn
  <dbl> <int> <dbl>
1     2     3     6
2     3     3     9
3     5     2    10

Upvotes: 2

Related Questions