【问题标题】:R: Apply, custom function and Dataframe namesR:应用、自定义函数和数据框名称
【发布时间】:2013-10-07 13:32:19
【问题描述】:

我有一个数据框Indices,其中包含与数据框相对应的各种名称(名称"Index 1"有一个对应的数据框Index 1)。

现在我想在所有数据框上运行我的自定义函数calcScores 并向该数据框添加几列。由于我不在全局环境中,因此我返回了那个“新”数据框并希望将其分配回原始变量 Index 1,因此 Index 1 现在有了带有添加列的新数据框。

这是我的代码(我不可能做到 100% 可重现,因为所有数据都是非常自定义的,但我希望你能理解我的问题)。

# Here the unique Index names are derived and stored
# Problem is the index names are stored as "Index 1", "Index 2" etc.
# Thats why I have to adjust These #titles and create individual data Frames
Indices <- unique(df[1])
apply(unique(df[1]), 1, function(x){
    assign(gsub(" ","",x,fixed=TRUE), subset(df,ticker==x), envir = .GlobalEnv)
})

calcRollingAverage <- function(Parameter, LookbackWindow){
    Output <- rollapply(Parameter, LookbackWindow, mean, fill=NA, partial=FALSE,
                        align="right")
}

calcScores<-function(Index, LookbackWindow){
    Index$PE_Avg = calcRollingAverage(Index$PE_Ratio, LookbackWindow)
    Index$PE_DIV_Avg = Index$PE_Ratio/Index$PE_Avg
    Index$PE_Score = cut(Index$PE_DIV_Avg, breaks=PE_Breaks, labels=Grades)

    return(Index)
}

apply(Indices,1,function(x) assign(gsub(" ","",x,fixed=TRUE), calcScores(get(gsub(" ","",x,fixed=TRUE)),lookback_window)))

我想我的问题在于apply 以及整个getassigngsub 故事。范围界定显然是问题所在......目前 apply 给出以下错误:

Error: unexpected symbol in:
"apply(Indices,1,function(x) assign(gsub(" ","",x,fixed=TRUE), calcScores(get(gsub(" ","",x,fixed=TRUE)),lookback_window))
apply"

【问题讨论】:

  • 只是小费。当您创建名为Index 1 等的变量时,您可能应该将它们存储在一个列表中。另外,你真的在​​变量名中包含空格吗?这听起来是个坏主意。

标签: r scope apply


【解决方案1】:

好的解决了它......对不起这个帖子。这就是解决方案:envir = .GlobalEnv

apply(Indices,1,function(x) assign(gsub(" ","",x,fixed=TRUE), calcScores(get(gsub(" ","",x,fixed=TRUE)),lookback_window),envir = .GlobalEnv))

【讨论】:

    【解决方案2】:

    为什么不直接使用for 循环,这将有助于解决范围问题?像这样:

    mydf1 <- data.frame(x=1:3, y=2:4)
    mydf2 <- data.frame(x=3:5, y=4:6)
    
    indices <- c("mydf1","mydf2")
    
    for (dfname in indices) {
        result <- get(dfname)
        result$z <- result$x+ result$y
        assign(dfname, result)
    }
    

    【讨论】:

    • @MichiZH 使用for 循环而不是矢量化函数会更慢。但在这里它不会有任何区别,我认为,因为你只是迭代一个列表一次。
    【解决方案3】:

    看起来您想按股票代码拆分数据并在每个拆分的元素上应用一个函数。

    这是byddplyplyr 包中的工作。

    by(df,df$ticker,FUN=calcScores,LookbackWindow=lookback_window)
    

    【讨论】: