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



我有一个数据集,它列出了一系列团队(例如"a"、"B"(和每个团队中用户的id。

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

示例数据集

  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被插入userid_out,用户2被插入user_id_in列。

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

所需输出

如有任何关于如何做到这一点的帮助,我们将不胜感激。:(

欢迎来到stackoverflow。请记住始终包含可复制的数据示例,不要共享屏幕截图。

您可以使用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

创建于2022-03-29由reprex包(v2.0.1(

最新更新