R:从组中间开始添加包含负值的数字序列



具有2列的示例数据帧:

groupID <- c(1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3)
index_ad <- c( 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0)
df <- data.frame(groupID, index_ad)

我想为每组添加另一列,从index_ad=1的行开始,然后根据该行是在index_ad=1的行之前还是之后添加连续的正数/负数。

ep_id <- c(0, 1, 2, 3, -2, -1, 0, 1, 2, -1, 0, 1, 2)
df1 <- data.frame(groupID, index_ad, ep_id)

我试过使用row_number,但它总是从每组的第一行开始。

df <- df %>% group_by(groupID) %>% mutate(ep_num = row_number()) %>% ungroup()

真实数据集具有>10000行和包括日期/时间在内的多个其他变量。组按日期/时间排列/排序,"index_ad"变量表示大小写/行是否应被视为该组的索引大小写。索引事例之前的所有事例/行都有之前发生的日期/时间,之后的所有事例或行都有之后发生的日期或时间。

请帮我弄清楚如何使用R添加"ep_id"数字序列!谢谢!

  • 您可以尝试
library(dplyr)
df |> group_by(groupID) |> mutate(ep_id = 1:n() - which(index_ad == 1))
  • 输出
# A tibble: 13 × 3
# Groups:   groupID [3]
groupID index_ad ep_id
<dbl>    <dbl> <int>
1       1        1     0
2       1        0     1
3       1        0     2
4       1        0     3
5       2        0    -2
6       2        0    -1
7       2        1     0
8       2        0     1
9       2        0     2
10       3        0    -1
11       3        1     0
12       3        0     1
13       3        0     2
df %>%
group_by(groupID) %>%
mutate(row  = row_number(),
ep_num = row - row[index_ad == 1]) %>%
ungroup()
# A tibble: 13 × 4
groupID index_ad   row ep_num
<dbl>    <dbl> <int>  <int>
1       1        1     1      0
2       1        0     2      1
3       1        0     3      2
4       1        0     4      3
5       2        0     1     -2
6       2        0     2     -1
7       2        1     3      0
8       2        0     4      1
9       2        0     5      2
10       3        0     1     -1
11       3        1     2      0
12       3        0     3      1
13       3        0     4      2

这里有一种方法。将行号减去which索引行等于1即可得到结果。

groupID <- c(1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3)
index_ad <- c( 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0)
df <- data.frame(groupID, index_ad)
suppressPackageStartupMessages(library(dplyr))
df %>%
group_by(groupID) %>%
mutate(ep_num = row_number(),
ep_num = ep_num - which(index_ad == 1)) %>%
ungroup()
#> # A tibble: 13 × 3
#>    groupID index_ad ep_num
#>      <dbl>    <dbl>  <int>
#>  1       1        1      0
#>  2       1        0      1
#>  3       1        0      2
#>  4       1        0      3
#>  5       2        0     -2
#>  6       2        0     -1
#>  7       2        1      0
#>  8       2        0      1
#>  9       2        0      2
#> 10       3        0     -1
#> 11       3        1      0
#> 12       3        0      1
#> 13       3        0      2

创建于2022-08-12由reprex包(v2.0.1(

我已经用两行代码对上面的mutate进行了编码,以使其更清晰,但它可以简化为

df %>%
group_by(groupID) %>%
mutate(ep_num = row_number() - which(index_ad == 1)) %>%
ungroup()

最新更新