行减去不同列表R中的行

时间:2013-01-01 13:07:31

标签: r

如何计算不同列表中不同行之间的差异? 不同的清单有不同的尺寸。 我使用如下代码

names(ri1)
[1] "Sedol" "code"  "ri"    "date"
ri1<-ri1[order(ri1$Sedol,ri1$date),]
sri<-split(ri1,ri1$Sedol)
ri1$r<-as.vector(sapply(seq_along(sri), function(x) diff(c(0, sri[[x]][,3]))))

然而它显示了结果

"Error in `$<-.data.frame`(`*tmp*`, "r", value = list(c(100, 0.00790000000000646,  : 
replacement has 1485 rows, data has 4687655"

例如

我有三个列表

  1. date  ri
    1990  1
    1991  2
    1992  3
    
  2. date  ri
    1990  1
    1991  2
    1992  3
    1993  4
    
  3. date  ri
    1990  1
    1991  2
    
  4. 我希望结果如

    1. date  ri  r
      1990  1   0%
      1991  2   100%
      1992  3   100%
      
    2. date  ri  r
      1990  1   0%
      1991  2   100%
      1992  3   100%
      1993  4   100%
      
    3. date  ri   r
      1990  1    0%
      1991  2    100%
      
    4. 通知:r= r(t+1)/r(t)-1

2 个答案:

答案 0 :(得分:0)

您应该使用headtail的组合,如下所示:

r.fun <- function(ri) c(0, tail(ri, -1) / head(ri, -1) - 1)
lapply(sri1, transform, r = r.fun(ri))

如果你的目标是在之后重新组合(rbind)你的数据,那么就知道你可以在一次调用中从基础包中分割/应用/组合所有内容,或{{1}来自ave包:

ddply

plyr

编辑:如果您希望输出在示例中为XX%,请将transform(ri1, r = ave(ri, Sedol, FUN = r.fun)) 替换为:

library(plyr)
ddply(ri1, "Sedol", transform, r = r.fun(ri))

答案 1 :(得分:0)

使用diff和lapply可以获得类似

的内容
# I generate some data
  dat1 <- data.frame(date = seq(1990,1999,length.out=5),ri = seq(1,10,length.out=5))
  dat2 <- data.frame(date = seq(1990,1999,length.out=5),ri=seq(1,5,length.out=5))
# I put the data.frame in a list 
  ll <- list(dat1,dat2)
 # I use lapply:
  ll <- lapply(ll,function(dat){
    # I apply the formula you give in a vector version
    # maybe you need only diff in percent?
    dat$r <- round(c(0,diff(dat$ri))/dat$ri*100)
    dat
  })
ll
[[1]]
     date    ri  r
1 1990.00  1.00  0
2 1992.25  3.25 69
3 1994.50  5.50 41
4 1996.75  7.75 29
5 1999.00 10.00 22

[[2]]
     date ri  r
1 1990.00  1  0
2 1992.25  2 50
3 1994.50  3 33
4 1996.75  4 25
5 1999.00  5 20
相关问题