Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
行减去不同列表R中的行_R - Fatal编程技术网

行减去不同列表R中的行

行减去不同列表R中的行,r,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])))) 我想要这样的结果

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

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]))))
  • 我想要这样的结果


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

    您应该结合使用
    头部
    尾部
    ,如下所示:

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

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

    r.fun <- function(ri) paste0(round(100 * c(0, tail(ri, -1) / head(ri, -1) - 1)), "%")
    

    r.fun使用diff和lappy可以得到

    # 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
    
    #我生成了一些数据
    
    dat1你确定你的r公式吗?它没有给出结果您可以通过使用
    dput
    提供
    ri1
    使示例重现。请参阅
    date  ri
    1990  1
    1991  2
    
    date  ri  r
    1990  1   0%
    1991  2   100%
    1992  3   100%
    
    date  ri  r
    1990  1   0%
    1991  2   100%
    1992  3   100%
    1993  4   100%
    
    date  ri   r
    1990  1    0%
    1991  2    100%
    
    r.fun <- function(ri) c(0, tail(ri, -1) / head(ri, -1) - 1)
    lapply(sri1, transform, r = r.fun(ri))
    
    transform(ri1, r = ave(ri, Sedol, FUN = r.fun))
    
    library(plyr)
    ddply(ri1, "Sedol", transform, r = r.fun(ri))
    
    r.fun <- function(ri) paste0(round(100 * c(0, tail(ri, -1) / head(ri, -1) - 1)), "%")
    
    # 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