如何遍历数据集比较相邻的行并在新列中输出结果的关系?

How to iterate through dataset comparing rows next to one another and output the relationship for results in new columns?

我有一个数据集,其中列出了一系列团队(例如“A”、“B”)以及每个团队中用户的 ID。

下面的示例数据集(前 2 列)。实际数据超过 500k,所以我一直试图在 R 中实现一个循环,但没有成功。

example dataset

  1. 我希望能够根据下一行来评估每一行,

    即如果第 1 行 = A 队 & 第 2 行 = A 队,“通过”,

    如果第 1 行 = A 队,第 2 行 = B 队,“失败”

    如果第 1 行 = B 队,第 2 行 = B 队,“通过”

    如果第 1 行 = B 队,第 2 行 = A 队,“失败”,

    每次迭代比较下一组行(例如,1 与 2 比较,然后 2 与 3 比较,依此类推)。

    每个在新列中的输出,详细说明结果,即 pass/fail。

  2. 如果结果是“通过”,我想要 2 个新列,第一列在第一行中有用户 ID,第二列是与之比较的行中的用户 - 就像一个边缘列表-例如在下面所需的输出格式中,比较第 1 行和第 2 行,每行都有团队和“通过”,因此用户 1 插入 user_id_out,用户 2 插入 user_id_in 列。

如果结果为失败,user_id_out(和中)的内容将为 NA。

Desired output

任何有关如何执行此操作的帮助将不胜感激。 :)

欢迎使用 Whosebug。请记住始终包含可重现的数据示例,不要共享屏幕截图。

您可以使用 dplyr 函数来完成。

library(dplyr)

# The data
data <- data.frame(
  team = c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'A', 'B', 'A', 'A', 'B', 'B'),
  user_id = c(1, 2, 3, 4, 5, 6, 7, 1, 5, 3, 4, 6, 7)
)

data %>%
  mutate(
    outcome = case_when(
      team == lead(team) ~ 'pass',
      TRUE ~ 'fail'
    ),
    user_id_out = ifelse(outcome == 'pass', user_id, NA),
    user_id_in = ifelse(outcome == 'pass', lead(user_id), NA)
  )
#>    team user_id outcome user_id_out user_id_in
#> 1     A       1    pass           1          2
#> 2     A       2    pass           2          3
#> 3     A       3    pass           3          4
#> 4     A       4    fail          NA         NA
#> 5     B       5    pass           5          6
#> 6     B       6    pass           6          7
#> 7     B       7    fail          NA         NA
#> 8     A       1    fail          NA         NA
#> 9     B       5    fail          NA         NA
#> 10    A       3    pass           3          4
#> 11    A       4    fail          NA         NA
#> 12    B       6    pass           6          7
#> 13    B       7    fail          NA         NA

reprex package (v2.0.1)

创建于 2022-03-29