【问题标题】:Naming a data.frame column from within function that creates it从创建它的函数中命名 data.frame 列
【发布时间】:2013-04-23 17:34:51
【问题描述】:

下面的代码使用我的滞后数据创建了一个数据框,但为了修复名称,我目前必须使用第二个“for”命令显式创建名称。我想在创建新列的函数内移动列名创建。这可能吗?

例如,我想调用一个新函数 MyLagNamed(Close[,1], i,"C") 而不是调用 MyLag(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="")

【问题讨论】:

    标签: r for-loop dataframe


    【解决方案1】:

    只需使用花括号 {} 将命名参数移动到 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
    

    【讨论】:

    • 虽然在这种情况下技术上可行,但我有很多函数,所以如果可能的话,我希望函数本身创建名称。在您上面的解决方案中,它要求每次我调用 MyLag 时,我都会以相同的方式编写 paste() 中的内容。 (即 - 我滞后于 Open、High、Low、Close,所以我必须在函数调用中多次而不是只做一次)
    • @LGTrader 检查编辑。我认为我发布的功能更具扩展性,但我不太明白你在问什么。如果你能澄清,那么我可以更好地帮助你。高低等是什么意思。这些在函数中是如何使用的?
    • Simon - 你的解决方案更接近我正在寻找的东西。我认为这还不是很正确,但这很可能是因为我最初解释得不够充分。就我而言,数据(开盘价、最高价、最低价、收盘价)是股票的价格数据。这是您在在线查看时在图表上看到的内容,等等。在数据框中,时间沿着行侧向下移动,MyLag 将数据正确地向下移动,创建延迟 1/2/3/ 天等的数据副本。我经常需要滞后所有价格类型(O/H/L/C),然后将它们添加到价格数据框中,以随着时间的推移对数据进行计算。
    • 在玩弄它之后,我将使用花括号更改。它足够干净,对于像我这样的非程序员来说,我认为随着时间的推移更容易维护。感谢您的帮助西蒙。
    猜你喜欢
    • 2012-05-13
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 2015-11-10
    相关资源
    最近更新 更多