我有一个数据集,它列出了一系列团队(例如"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被插入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(