按特定值排除的变量值的总和以另一个变量为条件排除。 如何在没有移调的情况下优雅地做到这一点? 因此,在下表中针对每个(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个单元格,这就是为什么它很短
谢谢!
阿塞尼奥
答案 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]))