下面的代码创建了一个带有滞后数据的数据框,但要修复名称,我当前必须使用第二个'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="")
答案 0 :(得分: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