查找和总和模拟数据

时间:2015-11-27 12:59:53

标签: r loops lookup

我有一些投资组合和模拟股票数据,并且正在寻找一种将它们相加的方法。尝试使用vlookups在excel中执行此操作,但是因为内存丢失而崩溃,所以我尝试使用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
}

然后将其绑定到我的p数据框。

我收到此错误,Error in p$stock1 : $ operator is invalid for atomic vectors

请让我知道你的想法。谢谢,

1 个答案:

答案 0 :(得分:1)

尝试:

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

它的作用如下:

  • 鉴于您希望拥有一些字符值和一些数值,您必须使用数据框
  • 你取一个s子集的列的总和(用你感兴趣的行)
  • 你追加那些原来的p

详细说明:as.data.frame(p,stringsAsFactors=F)将p转换为数据帧并将字符值保存为字符串,而不是因子。 t(sapply(1:nrow(p),function(x){colSums(s[p[x,],])}))是p(1:nrow(p))的每一行获取s(colSums)子集的列(s[p[x,],])之和的函数。输出应该是t ransposed。然后,您追加(cbind)原始p和新值。