Сумма отдельных элементов в векторе - PullRequest
1 голос
/ 04 июня 2019

Я бы хотел определить сумму для каждого отдельного элемента в векторе.

Например, предположим, у меня есть вектор

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

и я хочу найти сумму для каждого элемента.

Ответ будет примерно таким:

2: 6
3: 9
5: 10

Это потому, что есть три 2 (2 + 2 + 2 или 2 *) и т. Д.

Другими словами, я хочу существенно умножить число раз, сколько раз этот элемент найден в векторе.

Ответы [ 5 ]

3 голосов
/ 04 июня 2019

Использование базы 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

Если вы преобразуете это в фрейм данных, то это становится ( Как суммировать переменную по группе )

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
2 голосов
/ 04 июня 2019

Множество способов сделать это.Пара базовых подходов:

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
2 голосов
/ 04 июня 2019

Метод с 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
1 голос
/ 04 июня 2019

Мы можем использовать 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
1 голос
/ 04 июня 2019
library(tidyverse)

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