选择另一列中事件周围的行子集

问题描述 投票:0回答:1

我正在尝试创建一个包含数据子集的数据框,具体来说,是另一列中事件两侧的行块。

这是我的数据示例。它包括来自两个参与者的数据(由

id
标识)、
event
的时间(1 = 是,0 = 否)以及感兴趣的变量
x

df <- structure(list(id = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), event = c(1L, 
0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 
1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 
0L), x = c(-0.524745604197535, 0.56664753932467, 1.06326937193775, 
-1.74261927944691, -1.70220588525303, 0.788056468394497, -0.315524780669081, 
-1.09956621127396, 0.725332798657826, -0.821455118910762, -0.305075137324048, 
0.0975277444454113, -1.37607536240115, -1.1749745326815, -0.0254452552627888, 
0.0291714672416614, -0.560221734093268, -0.832517971223058, 1.01067311827293, 
-0.0101155699102594, -2.211772959964, -0.324879965548731, 0.189774016276101, 
-0.124110438315279, 0.87450859784393, 0.534102255268043, 0.483572995043595, 
0.717566852172195, 0.62058456685663, 0.100291898582953, -1.97147667641014, 
0.390331677978558, -2.44481260988607, -1.08221493718706, 1.282044558805, 
1.46339582810391, -0.388529539761603, -1.0347479743086, -0.244983560420757, 
-0.745529649917578, -0.581202927866314, -0.0468146194831979, 
0.353756786882484, 0.726051987010529, 0.785563528600549, 0.234591665330184, 
0.661859569057452, 0.718155884148953, 1.02606212190121, 0.35208377496606
)), row.names = c(NA, -50L), class = "data.frame")

我想对数据进行子集化,以便生成的数据帧包含来自

x
的数据,该数据对应于
event
两侧的 2 行(加上事件本身),因此每个事件 5 行。例如:

所以第一个问题是如何实现这一目标?

但是,其中一些行会重叠。在上图中,我创建了一个名为

cum_id
的累积 ID,用于标识每个事件。我们可以看到事件 2 和 3 之间的某些行(对于参与者 1)以及事件 1 和 2 之间的某些行(对于参与者 2)存在重叠。同样,第一个和最后一个事件也是不完整的。

因此,我想完全删除那些存在重叠的事件,并仅保留完整的行集,并优先考虑首先发生的事件。

因此最终产品应如下所示,其中

cum_id
唯一标识每个人的事件。

如果无法删除重叠事件,我想第二个选择是保留所有行,但

cum_id
更喜欢先发生的事件,这样第二个事件的行数将不完整(例如,4 个而不是 5 个)。

r subset conditional-formatting
1个回答
0
投票

我可以使用以下代码在每个事件之前添加 1 两行,在每个事件之后添加 1 两行:

library(dplyr)
    df |> 
  group_by(id) |> 
  mutate(cum_id = case_when(lag(lag(event)) == 1 ~ id,
                            lag(event) == 1 ~ id,
                            event == 1 ~ id,
                            lead(event) == 1 ~ id,
                            lead(lead(event)) == 1 ~ id,
                            .default = 0
                            )
         )

但是你剩下的作业我就搞不懂了。我们可以识别事件中的行,直到添加此行的下一个事件:

mutate(var2 = cumsum(row_number() == 1 | (event != dplyr::lag(event) & event != 0)))

© www.soinside.com 2019 - 2024. All rights reserved.