添加矢量中相同的值

时间:2015-12-15 15:46:14

标签: r

我有一个矢量 x <- c(1,2,5,4,3,1,1,4,2,6,7,2,4,1,5) 我想添加相同的值,给我新的向量 x <- c(4, 6, 3, 12, 10, 6, 7) 这听起来很简单,但我被卡住了。

5 个答案:

答案 0 :(得分:5)

您可以使用sapply迭代unique值的向量,然后对每个相应的条目求和,如下所示:

> sapply(unique(x), function(i) sum(x[x == i]))
[1]  4  6 10 12  3  6  7

如果订单相关,请说明您想要的订单。

在此解决方案中,顺序与unique的输出相同,您可以使用它来了解什么值的总和是什么。

> unique(x)
[1] 1 2 5 4 3 6 7

修改

看起来您想要唯一值的升序。在这种情况下,您可以这样做:

> sapply(sort(unique(x)), function(i) sum(x[x == i]))
[1]  4  6  3 12 10  6  7

答案 1 :(得分:2)

aggregate(x, list(number = x), FUN = sum )
#  number  x
#1      1  4
#2      2  6
#3      3  3
#4      4 12
#5      5 10
#6      6  6
#7      7  7

结果是data.frame,您可以像往常一样提取第二列。

答案 2 :(得分:2)

这是另一种选择,为了好玩:

with(rle(sort(x)), lengths * values)
# [1]  4  6  3 12 10  6  7

<强>基准

library(microbenchmark)
x <- c(1,2,5,4,3,1,1,4,2,6,7,2,4,1,5)
x <- rep(x, length.out=1000)

matthew <- function() with(rle(sort(x)), lengths * values) 
iled <- function() sapply(sort(unique(x)), function(i) sum(x[x == i])) 
kota <- function() as.numeric(table(x) * as.integer(names(table(x))))
deena <- function() {
    freqTable = as.data.frame(table(x))
    as.numeric(as.character(freqTable$x)) * freqTable$Freq
}
roland <- function() aggregate(x, list(number = x), FUN = sum )$x


microbenchmark(matthew(), iled(), kota(), deena(), roland())

# Unit: microseconds
#       expr    min     lq   mean median     uq  max neval
#  matthew()  105.5  116.9  167.5  122.5  131.3 1466   100
#     iled()  111.2  125.6  160.3  131.4  138.8 1449   100
#     kota() 1821.5 1899.3 1960.4 1915.9 1940.7 3031   100
#    deena() 1124.7 1175.6 1221.1 1187.9 1207.7 2700   100
#   roland() 1912.2 1967.9 2116.6 1995.5 2078.5 3610   100

答案 3 :(得分:1)

这样做的一种方法是将每个元素与其频率相乘。 table函数对此有用:

freqTable = as.data.frame(table(x))
requiredResult = as.numeric(as.character(freqTable$x)) * freqTable$Freq

答案 4 :(得分:1)

您想为每个#n * n计算n,其中#nn的出现次数。

只是上述sapply的替代方法。

table(x) * as.integer(names(table(x)))
# x
#  1  2  3  4  5  6  7 
#  4  6  3 12 10  6  7