0

以下のコードは、遅延データを含むデータフレームを作成しますが、名前を修正するには、現在、2 番目の「for」コマンドで名前を明示的に作成する必要があります。新しい列を作成する関数内に列名の作成を移動したいと思います。それは可能ですか?

たとえば、 MyLag(Close[,1], i) を呼び出す代わりに、新しい関数 MyLagNamed(Close[,1], i,"C") を呼び出すと、次のように設定された名前で列が返されますサンプルコード。

それは可能ですか?

ありがとう

MyLag <- function(x, k) c(rep(NA, k), x[1:(length(x)-k)] )

MaxColumns = 6

Close = structure(list(Close = c(12.8125, 12.97, 13.345, 13.625, 13.4375, 
                     13.6875, 13.75, 13.625, 13.3125, 13.875, 13.875, 13.9375, 13.875, 
                     14.3125, 14.6875, 14.375, 14.4075, 14.095, 14.4375, 14.375)), 
                     .Names = "Close", row.names = c(NA, -20L), class = "data.frame")

for (i in 1:MaxColumns) Close[i+1] <- MyLag(Close[,1], i)

for (i in 2:MaxColumns) colnames(Close)[i] = paste("MyLag(C,",i,")",sep="")
4

1 に答える 1

0

中括弧{}を使用して、命名引数をforループ内に移動するだけです。

for (i in 1:MaxColumns) {
    Close[i+1] <- MyLag(Close[,1], i)
    colnames(Close)[i+1] = paste("MyLag(C,",i+1,")",sep="")
}

しかし、これは物事を行う悪い方法のようです。これはそれほど優れているわけではありませんが、次のように、列に名前を付ける関数引数も含めます。

MyLag <- function( x , k , name = "C"){
    j <- 0:6
    k <- k[ , ncol(k) ]
    df <- data.frame( lapply( j , function(x) (c( rep( NA , x ) , k ))[1:length(k)] ) )
    names( df ) <- c( "Close" , paste("MyLag(" , name , 1:x , ")",sep="") )
    return(df)
}                     

次のような data.frame が得られます。

head( MyLag( 6 , Close , "High" ) , n = 7 )
    Close MyLag(High1) MyLag(High2) MyLag(High3) MyLag(High4) MyLag(High5) MyLag(High6)
1 12.8125           NA           NA           NA           NA           NA           NA
2 12.9700      12.8125           NA           NA           NA           NA           NA
3 13.3450      12.9700      12.8125           NA           NA           NA           NA
4 13.6250      13.3450      12.9700      12.8125           NA           NA           NA
5 13.4375      13.6250      13.3450      12.9700      12.8125           NA           NA
6 13.6875      13.4375      13.6250      13.3450      12.9700      12.8125           NA
7 13.7500      13.6875      13.4375      13.6250      13.3450      12.9700      12.8125
于 2013-04-23T17:48:20.443 に答える