使用R中的dplyr,根据当前行和后续行中的值计算新列

时间:2015-07-22 17:42:39

标签: r optimization dataframe dplyr

我有一个大数据集(10 + Mil x 30 vars),我正在尝试根据当前复杂的交互计算一些新变量。为清楚起见,我只包括问题中的重要变量。我在R中有以下代码,但我对其他观点和意见感兴趣。我正在使用dplyr包根据其他3列的当前/后续行值计算新列。 (代码下面有更多解释)

我想知道是否有办法让这更快更有效,或者可能完全改写它......

# the main function-data is a dataframe, windowSize and ratio are ints
computeNewColumn <- function(data,windowSize,ratio){

     #helper function used in the second mutate down...
     # all args are ints, i return a boolean out 
     windowAhead <- function(timeTo,window,reduction){

     # subset the original dataframe-only observations with values of
     # TimeToGo between timeTo-1 and window (basically the following X rows 
     # from the current one)
     subframe <- data[(timeTo-1 >= data$TimeToGo & data$TimeToGo >= window), ]
     isthere <- any(subframe$Price < reduction)
     return(isthere)
     }

  # I group by value of ID first and order by TimeToGo...  
  data %<>% group_by(ID) %>% 
  arrange(desc(TimeToGo)) %>%

  # ...create two new columns from simple interactions of existing ones...
  mutate(Window = ifelse(TimeToGo > windowSize, TimeToGo - windowSize, 0),
         Reduction = floor(Price - (ratio * Price))) %>% 
  rowwise() %>%

  #...now comes the more complex stuff- I want to compute a third column 
  # depending on the next (TimeToGo - Window) number of values of Price
  mutate(Advice = ifelse(windowAhead(TimeToGo,Window,Reduction),1,0) ) 

return(data)
}

我们有一个包含以下列的数据集:ID,Price,TimeToGo。

我们首先按ID值进行分组,然后根据当前行值(TimeToGo窗口和价格缩减)计算两个新列。接下来我们要做的是根据

计算新的第三列

1.减少的当前价值

2.数据框中Price的下一个(Window - TimeToGo)值。

我想知道是否有一种简单的方法可以在mutate()内引用列的即将到来的值?我理想地在一列上寻找滑动窗口函数,其中滑动窗口的限制是从另外两个当前列值设置的。我现在的解决方案只是使用自定义函数,该函数手动对原始数据帧进行子集,进行比较并返回值mutate()调用。任何帮助和想法将不胜感激!

P.S。下面是一个数据样本...如果您需要更多信息,请告诉我。谢谢!

> a
           ID TimeToGo Price
1 AQSAFOTO30A       96    19
2 AQSAFOTO20A       95    19
3 AQSAFOTO30A       94    17
4 AQSAFOTO20A       93    18
5 AQSAFOTO25A       92    19
6 AQSAFOTO30A       91    17

0 个答案:

没有答案