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"

例えば

私は3つのリストを持っています

  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

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 に答える
0

次のようにheadとを組み合わせて使用​​する必要があります。tail

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

後でデータを再結合 ( ) することが目標である場合は、基本パッケージまたはパッケージからの1rbind回の呼び出しですべてを分割/適用/結合できることを知っておいてください。aveddplyplyr

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 に答える