我有一个问题是从R中的data.frame中提取多个值并将它们放入一个新的data.frame中.
我有一个看起来像这样的data.frame(df)
PRICE EVENT
1.50 0
1.70 0
1.65 0
1.20 1
0.90 0
1.70 0
1.55 0
. .
. .
1.10 0
1.20 0
1.14 1
0.90 0
Run Code Online (Sandbox Code Playgroud)
我的实际data.frame有这两列和超过300.000行.名为EVENT的列仅具有值0 OR 1(值1是发生特定事件的代理).
我研究的第一步:如果事件发生,分析价格.第一步很简单.我做到了
vector<-df[df$EVENT==1, "PRICE"]
Run Code Online (Sandbox Code Playgroud)
现在vector包含活动日的所有价格.(这里:1.20和1.14)
但现在我研究的第二步是它变得有趣:
现在我不仅想要参加活动日的价格,还要了解活动日前后x天的价格,并将它们放入矩阵中
例如:我想要在活动前两天和活动后一天(包括活动日)的价格
比我想要创建的新data.frame看起来像
Event 1 Event n
-2 1.70 ... 1.10
-1 1.65 ... 1.20
0 1.20 ... 1.14
+1 0.90 ... 0.90
Run Code Online (Sandbox Code Playgroud)
请记住,4天的跨度[-2:1]只是一个例子.在我的实际研究中,我必须涵盖91天的跨度[-30:60].
谢谢您的帮助 :)
我要做的是,用滞后扩展基础数据数据框,然后按行选择。使用 tidyverse 会是这样的。(我强烈建议使用 tidyverse 而不是基本 R。但这取决于你)
library(tidyverse)
# generate example data frame
df <- data.frame(price = rnorm(100), event = rbinom(100, 1, 0.5))
# generate a vector from one the desired number of lags.
# we map this vector with a function that returns the lagged
# values of the price. then we join by columns
lags <- map(1:3, function(x){lag(df$price, n = x)}) %>%
reduce(cbind) %>% as.data.frame %>%
set_names(paste('priceLag', 1:3, sep = ''))
# bind lags to original data frame, select events == 1
out <- cbind(df, lags) %>% filter(df$event == 1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
743 次 |
| 最近记录: |