R - 如果第2列中出现特定值,则从第1列中提取多行

Bit*_*Bit 5 r rows dataframe

我有一个问题是从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].

谢谢您的帮助 :)

Joa*_*uin 0

我要做的是,用滞后扩展基础数据数据框,然后按行选择。使用 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)