2015-11-27 2 views
0

У меня есть несколько портфелей и смоделированные данные о запасах и вы хотите найти способ их суммирования. Пытаюсь сделать это в Excel с vlookups но грохот от потери памяти, поэтому я пытаюсь использовать R. Вот некоторые примерные данные:Поиск и сумма данных моделирования

 > p1 = c("a", "b", "c") 
    > p2 = c("d", "e", "f") 
    >p3 = c("a", "b", "c", "d", "e", "f") 
    > s1 = c(1,2,3,4,5,6) 
    > s1 = c(2,3,4,5,6,7) 
    > p = rbind(p1, p2) 
    > s = cbind(s1, s2) 
    > colnames(p)= c("Stock1", "Stock2", "Stock3") 
    > rownames(s) = p3 

     > p 
      Stock1 Stock2 Stock3 
     p1 "a" "b" "c" 
     p2 "d" "e" "f" 

     > s 
      s1 s2 
     a 1 2 
     b 2 3 
     c 3 4 
     d 4 5 
     e 5 6 
     f 6 7 

Я ищу, чтобы получить такой вывод

p1 "a" "b" "c" 6 9 
p2 "d" "e" "f" 15 18 

надеялся создать матрицу, как этот

i=1 
stocksim = null 
while (i < ncol(s)) { 
simsum = sum(s[p$stock1,i],s[p$stock2,i],s[p$stock3,i]) 
stocksim = cbind(stocksim,simsum) 
i=i+1 
} 

Тогда cbind это мой р кадра данных.

Я получаю эту ошибку, Error in p$stock1 : $ operator is invalid for atomic vectors

Пожалуйста, дайте мне знать ваши мысли. Спасибо,

+0

Это отлично подходит для этого небольшого набора, как я могу масштабировать его для больших портфелей и 6000 общих портфелей и 1000 симуляций? – JB17

+0

Приведенный ниже код работает также для большего количества p и s, если они находятся в том же формате, что и ваш пример. – etienne

ответ

1

Try:

p<-cbind(as.data.frame(p,stringsAsFactors=F),t(sapply(1:nrow(p),function(x){colSums(s[p[x,],])}))) 

p 
# Stock1 Stock2 Stock3 s1 s2 
# p1  a  b  c 6 9 
# p2  d  e  f 15 18 

Что она делает это следующим образом:

  • , учитывая, что вы хотите иметь несколько значений символов и некоторые числовые значения, которые вы должны использовать dataframe
  • вы берете суммы столбцов подмножества s (с интересующими вас строками)
  • вы добавляете те, которые делают оригинал p

Подробнее: as.data.frame(p,stringsAsFactors=F) преобразует p в фреймворк данных и сохраняет значения символов как строки, а не как факторы. t(sapply(1:nrow(p),function(x){colSums(s[p[x,],])})) - функция, которая для каждой строки p (1:nrow(p)) принимает суммы столбцов (colSums) подмножества s (s[p[x,],]). Выход должен быть t. Затем вы добавляете (cbind) оригинал p и новые значения.

+0

Это отлично работает для набора данных образца, но когда я расширяю его на свой большой набор данных, я получаю следующую ошибку. Ошибка в xj [i]: недопустимый индекс «list» – JB17

+0

Не удалось ли вы отрезать мой код в 4 частях и посмотреть, какая из них вызывает ошибку? Элементы 'sapply (1: nrow (p), function (x) {colSums (s [p [x,],])})', 't()' предыдущей части, 'as.data.frame (p, strAsAsFactors = F) 'и' cbind' – etienne

+0

Это то, что я пробовал, это часть sapply, вызывающая ошибку. Оба входа представляют собой кадры данных. Кажется, он исходит из s [p [x,],] – JB17