列表中数据帧的特定列上的rollapply函数

列表中数据帧的特定列上的rollapply函数,r,list,dataframe,lapply,rollapply,R,List,Dataframe,Lapply,Rollapply,我必须承认,当我试图理解函数中的函数是如何在R中定义和传递的时候,我完全是疯了。这些例子总是假定你理解每一个细微差别,而没有提供过程的描述。我还没有遇到一个简单的英语,白痴指南分解的过程。所以第一个问题是你知道其中一个吗 现在是我的身体问题。 我有一个数据列表。框架:文件数据。 我想对每个data.frame中的特定列使用rollappy()函数。然后,我希望所有结果(列表)合并在一起。因此,以内置mtcars数据帧为例,从其中一个data.frames开始: 当然,我需要告诉rollapply

我必须承认,当我试图理解函数中的函数是如何在R中定义和传递的时候,我完全是疯了。这些例子总是假定你理解每一个细微差别,而没有提供过程的描述。我还没有遇到一个简单的英语,白痴指南分解的过程。所以第一个问题是你知道其中一个吗

现在是我的身体问题。
我有一个数据列表。框架:文件数据。
我想对每个data.frame中的特定列使用rollappy()函数。然后,我希望所有结果(列表)合并在一起。因此,以内置mtcars数据帧为例,从其中一个data.frames开始:

当然,我需要告诉rollapply()使用函数PPI()以及相关参数,这些参数是列

PPI <- function(a, b){  
    value = (a + b)  
    PPI = sum(value)  
    return(PPI)  
}
我认为这与Zoo使用矩阵有关,但其他多次尝试都无法解决rollapply问题。因此,继续我认为下一步是:

lapply(fileData, function(x) rollapply ......
似乎有一英里远。非常欢迎提供一些指导和解决方案。

谢谢。

我将尽力帮助您并演示如何调试该问题。在R中非常有用的一个技巧是学习如何调试。我正在使用
浏览器
功能

问题: 在这里,我通过添加一行来更改函数
f

f <- function(x) {
  browser()
  PPI(x$changeFactor_A, x$changeFactor_B)
}
调试器停止,您可以检查参数x的值:

Browse[1]> x
 [1,] 
1e+05 
如您所见,它是一个标量值,因此无法对其应用
$
运算符,因此会出现以下错误:

Error in x$changeFactor_A : $ operator is invalid for atomic vectors 
一般指南 现在我将解释你应该如何做到这一点

  • 您可以更改PPI函数,使其具有单个参数
    excees
    :因此您可以在它之外执行减法(更简单)
  • 或者使用
    mapply
    获得一个通用的解决方案。(更难,但更一般,非常有用)
  • 避免在函数中使用
    $
    。就我个人而言,我只在R控制台上使用它
完整解决方案: 我假设data.frames(zoo对象)有changeFactor_A和changeFactor_B列

sapply(fileData,function(dat){
  dat <- transform(dat,excess= changeFactor_A-changeFactor_B)
  rollapply(dat[,'excess'],2,sum)
}
sapply(文件数据、函数(dat){

dat我将尝试帮助您并展示如何调试该问题。在R中非常有用的一个技巧是学习如何调试。我实际上使用的是
浏览器
功能

问题: 在这里,我通过添加一行来更改函数
f

f <- function(x) {
  browser()
  PPI(x$changeFactor_A, x$changeFactor_B)
}
调试器停止,您可以检查参数x的值:

Browse[1]> x
 [1,] 
1e+05 
如您所见,它是一个标量值,因此无法对其应用
$
运算符,因此会出现以下错误:

Error in x$changeFactor_A : $ operator is invalid for atomic vectors 
一般指南 现在我将解释你应该如何做到这一点

  • 您可以更改PPI函数,使其具有单个参数
    excees
    :因此您可以在它之外执行减法(更简单)
  • 或者您可以使用
    mapply
    来获得一个通用的解决方案。(更难但更通用,而且非常有用)
  • 避免在函数中使用
    $
    。我个人只在R控制台上使用它
完整解决方案: 我假设data.frames(zoo对象)有changeFactor_A和changeFactor_B列

sapply(fileData,function(dat){
  dat <- transform(dat,excess= changeFactor_A-changeFactor_B)
  rollapply(dat[,'excess'],2,sum)
}
sapply(文件数据、函数(dat){
dat查看帮助页面的“用法”部分,以
?rollapply
。我承认R帮助页面不容易解析,我知道您是如何感到困惑的

问题是,
rollapply
可以处理
ts
zoo
或general
numeric
向量,但只能处理一个序列。您为它提供了一个函数,该函数包含两个参数,
asset
benchmark
。当然,您的
f
PPI
可以简单地进行向量化,但
rollapply
根本不适合这样做

解决方案:在
rollappy
之外计算您的
exterx
exterx
易于矢量计算,并且不涉及任何滚动计算),只有在
rollappy
之后,才能将您的函数应用到它:

> mtcars$excess <- mtcars$mpg-mtcars$disp
> rollapply(mtcars$excess, 3, sum)
 [1]  -363.2  -460.8  -663.1  -784.8  -893.9 ...
>mtcars$excess rollapply(mtcars$excess,3,总和)
[1]  -363.2  -460.8  -663.1  -784.8  -893.9 ...
您可能对
mapply
感兴趣,它将函数矢量化为多个参数,类似于
apply
和friends,它们处理单个参数。但是,我知道没有类似于
mapply
的滚动窗口。

看看“用法”我承认R帮助页面不容易解析,我知道你是怎么弄糊涂的

问题是,
rollapply
可以处理
ts
zoo
或general
numeric
向量,但只能处理一个序列。您为它提供了一个函数,该函数包含两个参数,
asset
benchmark
。当然,您的
f
PPI
可以简单地进行向量化,但
rollapply
根本不适合这样做

解决方案:在
rollappy
之外计算您的
exterx
exterx
易于矢量计算,并且不涉及任何滚动计算),只有在
rollappy
之后,才能将您的函数应用到它:

> mtcars$excess <- mtcars$mpg-mtcars$disp
> rollapply(mtcars$excess, 3, sum)
 [1]  -363.2  -460.8  -663.1  -784.8  -893.9 ...
>mtcars$excess rollapply(mtcars$excess,3,总和)
[1]  -363.2  -460.8  -663.1  -784.8  -893.9 ...

您可能对
mapply
感兴趣,它将函数矢量化为多个参数,类似于
apply
和friends,它们处理单个参数。但是,我知道没有类似于
mapply
的滚动窗口。

我汗流浃背,花了一些时间慢慢了解如何打破pro使用另一个函数的参数调用函数的过程和协议。这是一个非常有用的站点,也是唯一的Hadley Wickham提供的!显示进程崩溃的图片接近理想状态。尽管我仍然需要思考一些细节

这是一个完整的例子,有注释
library(zoo)

#Create a list of dataframes for the example.
listOfDataFrames<- list(mtcars, mtcars, mtcars)
#Give each element a name.
names(listOfDataFrames) <- c("A", "B", "C")

#This is a simple function just for the example!
#I want to perform this function on column 'col' of matrix 'm'.
#Of course to make the whole task worthwhile, this function is usually something more complex.
fApplyFunction <- function(m,col){
    mean(m[,col])
}

#This function is called from lapply() and does 'something' to the dataframe that is passed.
#I created this function to keep lapply() very simply.
#The something is to apply the function fApplyFunction(), wich requires an argument 'thisCol'. 
fOnEachElement <- function(thisDF, thisCol){
    #Convert to matrix for zoo library.
    thisMatrix <- as.matrix(thisDF)
    rollapply(thisMatrix, 5, fApplyFunction, thisCol, partial = FALSE, by.column = FALSE)
}

#This is where the program really starts!
#
#Apply a function to each element of list.
#The list is 'fileData', with each element being a dataframe.
#The function to apply to each element is 'fOnEachElement'
#The additional argument for 'fOnEachElement' is "vs", which is the name of the column I want the function performed on.
#lapply() returns each result as an element of a list.
listResults <- lapply(listOfDataFrames, fOnEachElement, "vs")


#Combine all elements of the list into one dataframe.
combinedResults <- do.call(cbind, listResults)

#Now that I understand the argument passing, I could call rollapply() directly from lapply()...
#Note that ONLY the additional arguments of rollapply() are passed. The primary argurment is passed automatically by lapply().
listResults2 <- lapply(listOfDataFrames, rollapply, 5, fApplyFunction, "vs", partial = FALSE, by.column = FALSE)
> combinedResults
        A   B   C
 [1,] 0.4 0.4 0.4
 [2,] 0.6 0.6 0.6
 [3,] 0.6 0.6 0.6
 [4,] 0.6 0.6 0.6
 [5,] 0.6 0.6 0.6
 [6,] 0.8 0.8 0.8
 [7,] 0.8 0.8 0.8
 [8,] 0.8 0.8 0.8
 [9,] 0.6 0.6 0.6
[10,] 0.4 0.4 0.4
[11,] 0.2 0.2 0.2
[12,] 0.0 0.0 0.0
[13,] 0.0 0.0 0.0
[14,] 0.2 0.2 0.2
[15,] 0.4 0.4 0.4
[16,] 0.6 0.6 0.6
[17,] 0.8 0.8 0.8
[18,] 0.8 0.8 0.8
[19,] 0.6 0.6 0.6
[20,] 0.4 0.4 0.4
[21,] 0.2 0.2 0.2
[22,] 0.2 0.2 0.2
[23,] 0.2 0.2 0.2
[24,] 0.4 0.4 0.4
[25,] 0.4 0.4 0.4
[26,] 0.4 0.4 0.4
[27,] 0.2 0.2 0.2
[28,] 0.4 0.4 0.4
> listResults
$A
 [1] 0.4 0.6 0.6 0.6 0.6 0.8 0.8 0.8 0.6 0.4 0.2 0.0 0.0 0.2 0.4 0.6 0.8 0.8 0.6
[20] 0.4 0.2 0.2 0.2 0.4 0.4 0.4 0.2 0.4

$B
 [1] 0.4 0.6 0.6 0.6 0.6 0.8 0.8 0.8 0.6 0.4 0.2 0.0 0.0 0.2 0.4 0.6 0.8 0.8 0.6
[20] 0.4 0.2 0.2 0.2 0.4 0.4 0.4 0.2 0.4

$C
 [1] 0.4 0.6 0.6 0.6 0.6 0.8 0.8 0.8 0.6 0.4 0.2 0.0 0.0 0.2 0.4 0.6 0.8 0.8 0.6
[20] 0.4 0.2 0.2 0.2 0.4 0.4 0.4 0.2 0.4

> listResults2
$A
 [1] 0.4 0.6 0.6 0.6 0.6 0.8 0.8 0.8 0.6 0.4 0.2 0.0 0.0 0.2 0.4 0.6 0.8 0.8 0.6
[20] 0.4 0.2 0.2 0.2 0.4 0.4 0.4 0.2 0.4

$B
 [1] 0.4 0.6 0.6 0.6 0.6 0.8 0.8 0.8 0.6 0.4 0.2 0.0 0.0 0.2 0.4 0.6 0.8 0.8 0.6
[20] 0.4 0.2 0.2 0.2 0.4 0.4 0.4 0.2 0.4

$C
 [1] 0.4 0.6 0.6 0.6 0.6 0.8 0.8 0.8 0.6 0.4 0.2 0.0 0.0 0.2 0.4 0.6 0.8 0.8 0.6
[20] 0.4 0.2 0.2 0.2 0.4 0.4 0.4 0.2 0.4