我想确定向量中每个元素的总和。
例如,假设我有向量
x <- c(2,3,2,2,5,5,3,3)
我想找到每个元素的总和。
答案将类似于
2: 6
3: 9
5: 10
这是因为存在三个2(2 + 2 + 2或2 *),等等。
换句话说,我实际上是将数字乘以在向量中找到该元素的次数。
答案 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