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

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

我有一个数据集,其中列出了一系列团队(例如“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 比较,依此类推)。

    每个的输出都在一个新列中,详细说明结果,即通过/失败。

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

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

Desired output

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

r for-loop if-statement
1个回答
0
投票

您可以使用 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 包于 2022-03-29 创建(v2.0.1)

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