R - 如果某个值出现在第 2 列中,则从第 1 列中提取多行

标签 r dataframe rows

我有一个关于从 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

我的实际 data.frame 有这两列和超过 300.000 行。名为 EVENT 的列只有值 0 或 1(值 1 代表某个事件发生)。

我研究的第一步:如果事件发生,分析价格。
第一步很简单。我做到了
vector<-df[df$EVENT==1, "PRICE"]

现在 vector包含事件日的所有价格。 (此处:1.20 和 1.14)

但现在我研究的第二步是它变得有趣的地方:

现在我不仅想要 eventday 的价格,还想要 eventday 之前和之后 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

请记住,4 天跨度 [-2:1] 只是一个示例。在我的实际研究中,我必须涵盖 91 天的跨度 [-30:60]。

谢谢您的帮助 :)

最佳答案

我们可以创建一个包含相关行号的矩阵,然后将其用作掩码以达到您的预期输出:

event_rows <- which(df$EVENT==1)
mask <- sapply(event_rows, function(x) (x-2):(x+2))
apply(mask, 2, function(x) df$PRICE[x])
#     [,1] [,2]
#[1,] 1.70 1.10
#[2,] 1.65 1.20
#[3,] 1.20 1.14
#[4,] 0.90 0.90
#[5,] 1.70   NA

数据
df <- structure(list(PRICE = c(1.5, 1.7, 1.65, 1.2, 0.9, 1.7, 1.55, 
1.1, 1.2, 1.14, 0.9), EVENT = c(0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 
0L, 1L, 0L)), .Names = c("PRICE", "EVENT"), class = "data.frame", row.names = c(NA, 
-11L))

关于R - 如果某个值出现在第 2 列中,则从第 1 列中提取多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48438952/

相关文章:

c++ - 在 Rcpp 中调试运行时错误

r - 您将如何对动物园对象列表中的相同列求和?

python - 通过在每个 df 列上应用函数来创建系列

css - 具有 2 个部分的嵌套网格显示不一致的行大小和重叠元素

r - 如何使用 R 合并两个没有公共(public)列名的数据框

r - 使用 llply 将函数应用到列表 - 如何处理不合格的条目?

MySQL加入3个表和空行

php - 无法从 mySQL 的行中获取数据以打印出来-PHP

r - log-pdf的核估计

python - 如何提取垂直条件下的行