如何在长格式tibble中比对配对变量与逆序配对并取较大值
解决方案
你可以通过生成无顺序的配对标识分组取最大值实现,逻辑简洁易读,适配tidyverse的mutate操作习惯:
library(tidyverse) # 载入你的示例数据 df1 <- tibble( n1 = rep(c('a', 'b', 'c'), each=3), n2 = rep(c('a', 'b', 'c'),3), v1 = c(41,94,40,85,82,35,66,70,76) ) # 核心实现代码 df_result <- df1 %>% # 生成无顺序的配对唯一标识 group_by(pair = pmap_chr(list(n1, n2), ~str_sort(c(...)) %>% str_c(collapse = "_"))) %>% # 同配对组内取最大值即为正反两个结果的较大值 mutate(v1.high = max(v1)) %>% ungroup() %>% # 删除临时生成的配对标识列 select(-pair)
如果你的数据量较大,不想用分组操作,也可以直接通过匹配逆序位置的方式单行实现:
df_result <- df1 %>% mutate( # 匹配当前行逆序配对的行位置 rev_pos = match(str_c(n2, n1), str_c(n1, n2)), # 取当前值和逆序配对值的最大值 v1.high = pmax(v1, v1[rev_pos]) )
两种方式输出结果都和你给出的预期完全一致。
内容的提问来源于stack exchange,提问作者ahaswer
相关产品推荐
相关产品推荐

