我有一个大数据集(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