向量中各个元素的总和

时间:2019-06-04 01:19:08

标签: r dplyr tidyverse

我想确定向量中每个元素的总和。

例如,假设我有向量

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

我想找到每个元素的总和。

答案将类似于

2: 6
3: 9
5: 10

这是因为存在三个2(2 + 2 + 2或2 *),等等。

换句话说,我实际上是将数字乘以在向量中找到该元素的次数。

5 个答案:

答案 0 :(得分:3)

使用底数R tapply

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

如果需要将其用作数据框,请将其包装在stack

stack(tapply(x, x, sum))

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

如果将其转换为数据框,则其变为(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

答案 1 :(得分:2)

使用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

答案 2 :(得分:2)

很多方法可以做到这一点。一些基本方法:

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

或者:

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

答案 3 :(得分:1)

library(tidyverse)

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

答案 4 :(得分:1)

我们可以使用rowsum中的base R

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

或与by

by(x, x, FUN = sum)

或与split

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

或带有xtabs

的另一个选项
xtabs(x1 ~ x, cbind(x1 = x, x))
#  2  3  5 
#  6  9 10 

或与ave

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

或使用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