2

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

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
    

我想要这样的结果

  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%
    

注意:r= r(t+1)/r(t)-1

4

2 回答 2

0

您应该使用 和 的组合,head如下tail所示:

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

如果您的目标是rbind之后重新组合 ( ) 您的数据,那么请知道您可以在一次调用中拆分/应用/组合所有内容,以从ave基本包或包中调用:ddplyplyr

transform(ri1, r = ave(ri, Sedol, FUN = r.fun))

或者

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

编辑:如果您希望输出为示例中的 XX%,请替换r.fun为:

r.fun <- function(ri) paste0(round(100 * c(0, tail(ri, -1) / head(ri, -1) - 1)), "%")
于 2013-01-01T13:46:37.897 回答
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
于 2013-01-01T13:52:13.530 回答