我有一个矢量
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)
这听起来很简单,但我被卡住了。
答案 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
,其中#n
是n
的出现次数。
只是上述sapply
的替代方法。
table(x) * as.integer(names(table(x)))
# x
# 1 2 3 4 5 6 7
# 4 6 3 12 10 6 7