我有一个数据集,其中列出了一系列团队(例如“A”、“B”)以及每个团队中用户的 ID。
下面的示例数据集(前 2 列)。实际数据超过 500k,所以我一直在尝试在 R 中实现循环,但没有成功。
我希望能够根据下一行评估每一行,
即如果第 1 行 = A 队且第 2 行 = A 队,“通过”,
如果第 1 行 = A 队且第 2 行 = B 队,则“失败”
如果第 1 行 = B 队且第 2 行 = B 队,“通过”
如果第 1 行 = B 队且第 2 行 = A 队,“失败”,
每次迭代都会比较下一组行(例如,1 与 2 比较,然后 2 与 3 比较,依此类推)。
每个的输出都在一个新列中,详细说明结果,即通过/失败。
如果结果是“通过”,我想要两个新列,第一列在第一行中有用户 ID,第二列在与之比较的行中包含用户 - 就像边缘列表 - 例如在下面所需的输出格式中,比较第 1 行和第 2 行,每行都有团队,并且“通过”,因此用户 1 被插入到 user_id_out 列中,用户 2 被插入到 user_id_in 列中。
如果结果失败,则 user_id_out(和 in)的内容将为 NA。
任何有关如何执行此操作的帮助将不胜感激。 :)
您可以使用 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)