R向量化替代For循环涉及非数字运算(数据帧重建)

时间:2015-09-04 20:51:17

标签: r performance for-loop dataframe vectorization

这是我的问题:

假设我有一个数据框显示某些项目的某些观察结果。这些观察包含 numeric 值以及一些字符属性。它是这样的:

items <- c("item1","item1","item1","item2","item2","item3")
proptyA <- c("prop1", "prop1", "prop1", "prop2", "prop2", "prop2")
proptyB <- c("prop11", "prop11", "prop11", "prop11", "prop11", "prop12")
proptyC <- c("prop22", "prop22", "prop22", "prop22", "prop22", "prop22")
values <- c(1:6)

rawDF <- data.frame(items, proptyA, proptyB, proptyC, values, stringsAsFactors = F)

  items proptyA proptyB proptyC values
1 item1   prop1  prop11  prop22      1
2 item1   prop1  prop11  prop22      2
3 item1   prop1  prop11  prop22      3
4 item2   prop2  prop11  prop22      4
5 item2   prop2  prop11  prop22      5
6 item3   prop2  prop12  prop22      6

我正在寻找一种重建数据框的方法,以围绕&#39;项目&#39;而不是目前的观察。得到的数据帧将呈现一些值的聚合(例如总和)。没有真正的聚合&#39;由于每个项目只有一种类型的唯一属性,因此需要进行属性。

结果数据框应如下所示:

  items proptyA proptyB proptyC values
1 item1   prop1  prop11  prop22      6
2 item2   prop2  prop11  prop22      9
3 item3   prop2  prop12  prop22      6 

可悲的是,我没有看到如何在不诉诸循环的情况下获得此结果。当然tapply(rawDF$values, rawDF$items, sum)会对数字位进行排序,但属性中的字符呢。

然而,由于我正在使用的真实数据集的大小,循环对我来说不是一个选项。

我将不胜感激任何帮助。使用额外的包装等绝对没问题,但如果有的话,更喜欢基础R解决方案。

谢谢!

1 个答案:

答案 0 :(得分:2)

使用aggregate

aggregate(rawDF$values, by=rawDF[, c("items", "proptyA", "proptyB", "proptyC")], sum)

  items proptyA proptyB proptyC x
1 item1   prop1  prop11  prop22 6
2 item2   prop2  prop11  prop22 9
3 item3   prop2  prop12  prop22 6

修改:使用公式类

aggregate(values~., rawDF, sum)

  items proptyA proptyB proptyC values
1 item1   prop1  prop11  prop22      6
2 item2   prop2  prop11  prop22      9
3 item3   prop2  prop12  prop22      6