如何根据days_op与days_tc的最大值匹配对应xvar字段值?
解决方案
首先注意:测试数据中有重复的列名xvar_op,第二个对应days_tc的列应该是xvar_tc,修正后的测试数据如下:
test = structure(list(identificacionSujeto = c("dave", "dave", "dave", "dave", "dave" ), date= structure(c(18992, 18992, 18992, 18992, 18992), class = c("IDate", "Date")), categ = c("T", "T", "T", "T", "T"), days_op = c(24, 50, 3, 11, 70), xvar_op = c("CO", "ON", "CO", "ON", "CO"), categ_op = c("T", "T", "T", "T", "T"), days_tc = c(54, 15, 90, 10, 54), xvar_tc = c("PN", "NM", "PN", "PN", "PN"), categ_tc = c("Y", "V", "Y", "Y", "Y")), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), row.names = c(NA, -5L), groups = structure(list(identificacionSujeto = "dave", .rows = structure(list(1:5), ptype = integer(0), class = c("vctrs_list_of", "vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -1L), .drop = TRUE))
方法一:长格式转换匹配最大值对应变量
使用dplyr和tidyr,将数据转为长格式后找到分组内最大天数对应的xvar,再合并回原数据:
library(dplyr) library(tidyr) test_result <- test %>% mutate(row_id = row_number()) %>% # 拆分days和xvar的分组信息 pivot_longer( cols = starts_with(c("days_", "xvar_")), names_to = c(".value", "group"), names_pattern = "(days|xvar)_(.*)" ) %>% group_by(identificacionSujeto) %>% mutate(max_days = max(days)) %>% # 筛选最大值对应的xvar filter(days == max_days) %>% distinct(identificacionSujeto, max_xvar = xvar) %>% # 合并回原始数据 right_join(test %>% mutate(row_id = row_number()), by = "identificacionSujeto") %>% select(-row_id) %>% rename(expected_output = max_xvar)
方法二:直接逻辑判断匹配最大值对应变量
无需转换格式,直接计算全局最大值并判断其所属分组,提取对应xvar:
test_result <- test %>% group_by(identificacionSujeto) %>% mutate( # 计算分组内days_op和days_tc的全局最大值 global_max = max(c(days_op, days_tc)), # 根据最大值来源提取对应xvar expected_output = case_when( global_max %in% days_op ~ xvar_op[days_op == global_max][1], global_max %in% days_tc ~ xvar_tc[days_tc == global_max][1] ) ) %>% ungroup() %>% select(-global_max)
运行任意一种方法后,test_result中的expected_output列都会和示例期望输出一致,所有行取值为PN。
内容的提问来源于stack exchange,提问作者cdcarrion
相关产品推荐
相关产品推荐

