dplyr批量处理:生成二元匹配标识与连续变量绝对差值
我手上有一份包含好友关系及各用户个体特征的数据集,需要针对二元指标生成配对双方是否匹配的标识变量,针对连续指标生成二者取值的绝对差值变量。
手动实现该需求并不复杂,但我共有约60个变量需要处理,因此想找到比现有方案更高效的批量实现方法。
示例数据
dat <- read.table(text = "id.x id.y male.x smoke.x drink.x everfight.x grades.x male.y smoke.y drink.y everfight.y grades.y 1 6 0 2 4 1 3 0 2 1 0 2 2 7 0 2 4 0 5 0 2 3 1 4 3 8 1 4 4 1 2 0 4 2 1 1 4 9 0 2 3 1 2 0 3 2 0 1 5 10 1 2 4 0 4 1 4 1 0 4", header = TRUE)
当前实现代码
dat <- dat %>% mutate(sex_match = case_when(male.x == male.y ~ 1, TRUE ~ 0), fight_match = case_when(everfight.x == everfight.y ~ 1, TRUE ~ 0), smoke_diff = abs(smoke.x - smoke.y), drink_diff = abs(drink.x - drink.y), grades_diff = abs(grades.x - grades.y))
运行后可以得到完全符合预期的输出:
id.x id.y male.x smoke.x drink.x everfight.x grades.x male.y smoke.y drink.y everfight.y grades.y sex_match fight_match smoke_diff drink_diff grades_diff 1 6 0 2 4 1 3 0 2 1 0 2 1 0 0 3 1 2 7 0 2 4 0 5 0 2 3 1 4 1 0 0 1 1 3 8 1 4 4 1 2 0 4 2 1 1 0 1 0 2 1 4 9 0 2 3 1 2 0 3 2 0 1 1 0 1 1 1 5 10 1 2 4 0 4 1 4 1 0 4 1 1 2 3 0
我想知道是否可以通过循环或apply类函数自动识别配对变量,批量生成上述匹配标识与绝对差值变量。
方案更新
最终我结合Jon与akrun回答中的部分逻辑,得到了最适配需求的实现方案:
non_binary <- dat %>% select(., contains(".x")) %>% select(., -id.x) %>% select_if(~!all(. %in% 0:1)) %>% rename_with(~str_remove(., '.x')) %>% names() dat %>% pivot_longer(-c(id.x:id.y), names_to = c("var", ".value"), names_pattern = "(.+).(.+)") %>% mutate(match = if_else(var %in% non_binary, abs(x - y), 1L * (x == y))) %>% mutate(col_name = paste(var, ifelse(var %in% non_binary, "diff", "match"), sep = "_")) %>% select(-c(var:y)) %>% pivot_wider(names_from = col_name, values_from = match)
感谢两位的解答。
内容的提问来源于stack exchange,提问作者L. Tucker
相关产品推荐
相关产品推荐

