我有两个向量,一个带有(浮点)标签,一个带有值,例如
x = c(100.5, 101, 100.5, 102, 99.9, 101, 100.5)
y = c( 3, 1, 1, 2, 0, 1, 0)
我要找的结果是每个标签的总和,即
res = list("100.5" = 3+1, "101" = 1+1, "102" = 2)
(理想情况下" 99.9"不存在,如上所示;但如果它的计数为零也是可接受的。)
我认识的R惯用语似乎都不起作用,所以我尝试了一个C ++样式循环:使用for
循环迭代y
,从x
获取值,但是然后我就卡在" res
" part(知道是否初始化新元素,或添加到现有条目)。在R中这样做是觉得错误的!
顺便说一句
它不一定是list
;一个命名的向量,或类table
,也没关系。 (如果是C ++我会使用std::map<double,double>
。)我接下来需要做的一件事就是能够合并它们,并且命名向量至少会出错:
res1 = c(3,4,5);names(res1) = c("100.5","101","102")
res2 = c(2,4,6);names(res2) = c("99.5", "100.5", "102")
res3 = c(2,7,4,11);names(res3) = c("99.5", "100.5", "101", "102")
res1 + res2
res1 + res2
没有给我res3
。对list
个对象做同样的事情会给二元运算符#34;提供非数字参数。 (https://stackoverflow.com/a/12897398/841830显示如何将table
个对象加在一起;类似的方法可能适用于命名向量...)
答案 0 :(得分:3)
Base R有一系列 apply 函数,您可以阅读lots about here。通过阅读(并希望留在基础R),tapply
是您正在寻找的,它应用基于分组的函数并压缩结果。
x = c(100.5, 101, 100.5, 102, 99.9, 101, 100.5)
y = c( 3, 1, 1, 2, 0, 1, 0)
tapply(y, INDEX = as.factor(x), sum)
# 99.9 100.5 101 102
# 0 4 2 2
您还可以使用aggregate
:
aggregate(y, by = list(x), FUN = sum)
# Group.1 x
# 1 99.9 0
# 2 100.5 4
# 3 101.0 2
# 4 102.0 2
至于你的其他问题,我强烈建议使用数据框,而不是试图用命名向量做太多。有许多用于处理数据框架的基础架构(在基础R,merge
,aggregate
和许多其他基础架构中;还有data.table
和dplyr
软件包。 / p>
另外请注意,使用浮点数作为标签是有风险的......我尽可能将它们保留为character
或factor
类,以避免浮点精度导致的错误。
答案 1 :(得分:2)
我们也可以使用xtabs
。默认情况下,它获取sum
xtabs(y~x)
#x
# 99.9 100.5 101 102
# 0 4 2 2
答案 2 :(得分:1)
也许这个:
x = c(100.5, 101, 100.5, 102, 99.9, 101, 100.5)
y = c( 3, 1, 1, 2, 0, 1, 0)
df <- data.frame(x1=as.character(x),x2=y,stringsAsFactors=F)
keys <- unique(df$x1)
vals <- sapply(keys,function (x) sum(df[x==df$x1,]$x2))
vals
产生
100.5 101 102 99.9
4 2 2 0