如何遍历数据集比较相邻的行并在新列中输出结果的关系?
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 行 = A 队 & 第 2 行 = A 队,“通过”,
如果第 1 行 = A 队,第 2 行 = B 队,“失败”
如果第 1 行 = B 队,第 2 行 = B 队,“通过”
如果第 1 行 = B 队,第 2 行 = A 队,“失败”,
每次迭代比较下一组行(例如,1 与 2 比较,然后 2 与 3 比较,依此类推)。
每个在新列中的输出,详细说明结果,即 pass/fail。
如果结果是“通过”,我想要 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
我有一个数据集,其中列出了一系列团队(例如“A”、“B”)以及每个团队中用户的 ID。
下面的示例数据集(前 2 列)。实际数据超过 500k,所以我一直试图在 R 中实现一个循环,但没有成功。
example dataset
我希望能够根据下一行来评估每一行,
即如果第 1 行 = A 队 & 第 2 行 = A 队,“通过”,
如果第 1 行 = A 队,第 2 行 = B 队,“失败”
如果第 1 行 = B 队,第 2 行 = B 队,“通过”
如果第 1 行 = B 队,第 2 行 = A 队,“失败”,
每次迭代比较下一组行(例如,1 与 2 比较,然后 2 与 3 比较,依此类推)。
每个在新列中的输出,详细说明结果,即 pass/fail。
如果结果是“通过”,我想要 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