По группам: сумма значений переменных при условии - PullRequest
2 голосов
/ 21 февраля 2012

Сумма значений переменных по группам, за исключением определенных значений, обусловленных другой переменной.Как сделать это элегантно без транспонирования?Поэтому в приведенной ниже таблице для каждого (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

+---------+---------+-----------+-------------+-------------+
| 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.Конечный результат должен быть excl_val для каждого sTicker для каждого DATE_f и для каждого fTicker.

Я сделал это путем транспонирования в SAS с результирующим файлом около 6 ГБ, но тот же подход в R, увеличил объем памяти до 40 ГБ, и это в основном неработоспособно.

В R я дошел до этого

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

, но это просто простая сумма (без исключения необходимого наблюдения), и есть несоответствие между длинами строк.Если бы я мог обусловить сумму, чтобы исключить sTicker obs для wght из суммирования, я думаю, что это могло бы сработать.

О длине excl_val: я вычислил ее в excel, всего для 2 ячеек, поэтому она короткая

Спасибо!

Арсенио

1 Ответ

1 голос
/ 21 февраля 2012

Если у вас есть данные в 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]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...