如何在R中(如使用dplyr)将配对组中一方的值映射给另一方?
配对组内伙伴变量映射实现方法
我有一组配对组(dyad)内个体的数据,数据构造代码如下:
out <- data.frame("id" = seq(1:8), dyad = rep(letters[1:4], each = 2, times = 1), income = rep(c(1000, 900), 4) )
生成的原始数据:
| id | dyad | income |
|---|---|---|
| 1 | a | 1000 |
| 2 | a | 900 |
| 3 | b | 1000 |
| 4 | b | 900 |
| 5 | c | 1000 |
| 6 | c | 900 |
| 7 | d | 1000 |
| 8 | d | 900 |
需要新增一列income_partner,显示每个配对组内伙伴的收入,预期最终数据如下:
| id | dyad | income | income_partner |
|---|---|---|---|
| 1 | a | 1000 | 900 |
| 2 | a | 900 | 1000 |
| 3 | b | 1000 | 900 |
| 4 | b | 900 | 1000 |
| 5 | c | 1000 | 900 |
| 6 | c | 900 | 1000 |
| 7 | d | 1000 | 900 |
| 8 | d | 900 | 1000 |
解决方案
方法一:Base R 原生实现
利用ave()函数按配对组分组,对每组的income取反序,直接生成目标列:
out$income_partner <- ave(out$income, out$dyad, FUN = function(x) rev(x))
方法二:dplyr 包实现(tidyverse 风格)
如果习惯使用tidyverse生态,可通过分组后反转列值实现:
library(dplyr) out <- out %>% group_by(dyad) %>% mutate(income_partner = rev(income)) %>% ungroup()
方法三:data.table 包实现(高效处理大数据)
针对大规模数据集,data.table的分组操作效率更优:
library(data.table) setDT(out)[, income_partner := rev(income), by = dyad]
以上方法的核心逻辑是按配对组分组后,反转组内的目标变量顺序,适用于每组恰好2个个体的配对场景;若每组个体数更多,可根据具体的伙伴对应逻辑调整反转或索引方式。
内容的提问来源于stack exchange,提问作者Joseph Bulbulia
相关产品推荐
相关产品推荐

