如何从R

时间:2015-12-28 23:21:48

标签: r

我有两个向量,一个带有(浮点)标签,一个带有值,例如

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个对象加在一起;类似的方法可能适用于命名向量...)

3 个答案:

答案 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,mergeaggregate和许多其他基础架构中;还有data.tabledplyr软件包。 / p>

另外请注意,使用浮点数作为标签是有风险的......我尽可能将它们保留为characterfactor类,以避免浮点精度导致的错误。

答案 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