按组:条件下变量值的总和

时间:2012-02-21 01:43:29

标签: r

按特定值排除的变量值的总和以另一个变量为条件排除。 如何在没有移调的情况下优雅地做到这一点? 因此,在下表中针对每个(fTicker,DATE_f),我试图将 wght 的值与 wght 的值相加,条件是从总和中排除的sTicker。

在下表中,(excl_val,sTicker = A)|(fTicker = XLK,DATE_f = 6/20/2003)= wght_AAPL_6 / 20 / 2003_XLK + wght_AA_6 / 20 / 2003_XLK但不是sTicker = A < / p>

+---------+---------+-----------+-------------+-------------+
| sTicker | fTicker |  DATE_f   |    wght     |  excl_val   |
+---------+---------+-----------+-------------+-------------+
| A       | XLK     | 6/20/2003 | 0.087600002 | 1.980834016 |
| A       | XLK     | 6/23/2003 | 0.08585     | 1.898560068 |
| A       | XLK     | 6/24/2003 | 0.085500002 |             |
| AAPL    | XLK     | 6/20/2003 | 0.070080002 |             |
| AAPL    | XLK     | 6/23/2003 | 0.06868     |             |
| AAPL    | XLK     | 6/24/2003 | 0.068400002 |             |
| AA      | XLK     | 6/20/2003 | 1.910754014 |             |
| AA      | XLK     | 6/23/2003 | 1.829880067 |             |
| AA      | XLK     | 6/24/2003 | 1.819775    |             |
|         |         |           |             |             |
|         |         |           |             |             |
+---------+---------+-----------+-------------+-------------+

有几个fTicker组中有很多sTicker(10到70),有些sTicker可能属于几个fTicker。对于每个DATE_f和每个fTicker,最终结果应该是每个sTicker的excl_val。

我是通过在SAS中进行转置而得到的,结果文件大约为6 GB,但在R中使用相同的方法,将内存压缩到40 gb,这基本上是不可行的。

在R中,我得到了这个

weights$excl_val  <- with(weights, aggregate(wght, list(fTicker, DATE_f), sum, na.rm=T))

但它只是一个简单的总和(不排除必要的观察)并且行长度之间存在不匹配。如果我可以调整总和以从总和中排除sTicker obs for wght,我认为它可能有效。

关于excl_val长度:我在excel中计算它,只有2个单元格,这就是为什么它很短

谢谢!

阿塞尼奥

1 个答案:

答案 0 :(得分:1)

当您在data.frame中有数据时,如果行有意义则更好 (特别是,列应具有相同的长度): 在这种情况下,excl_val看起来像一个单独的向量。 将其包含的信息放入data.frame后, 事情变得容易了。

# Sample data
k <- 5
d <- data.frame(
  sTicker = rep(LETTERS[1:k], k),
  fTicker = rep(LETTERS[1:k], each=k),
  DATE_f = sample( seq(Sys.Date(), length=2, by=1), k*k, replace=TRUE ),
  wght = runif(k*k)
)
excl_val <- sample(d$wght, k)
# Add a "valid" column to the data.frame
d$valid <- ! d$wght %in% excl_val
# Compute the sum
library(plyr)
ddply(d, c("fTicker","DATE_f"), summarize, sum=sum(wght[valid]))