如何在长格式数据集中计算家庭内的差值与均值变量
解决方案
可以用dplyr包的分组操作实现,核心思路是按家庭(FAMID)分组后,先判断家庭成员数,仅对成员数为2的家庭计算均值和与均值的差值,单成员家庭对应列设为NA。
代码实现
library(dplyr) # 原始数据集 df <- data.frame(FAMID = c(1,1,2,2,3,4,5,5,6), IID = c("A","B","A","B","A","B","A","B","B"), Value = c(3,6,3,5,6,7,0,4,4)) # 计算目标变量 df_result <- df %>% group_by(FAMID) %>% mutate( # 计算家庭成员数 n_members = n(), # 仅当成员数为2时计算均值,否则为NA Mean = ifelse(n_members == 2, mean(Value), NA), # 仅当成员数为2时计算差值,否则为NA DiffValue = ifelse(n_members == 2, Value - Mean, NA) ) %>% # 移除中间变量n_members(可选) select(-n_members) %>% ungroup() # 查看结果 df_result
输出结果
# A tibble: 9 × 5 FAMID IID Value Mean DiffValue <dbl> <chr> <dbl> <dbl> <dbl> 1 1 A 3 4.5 -3 2 1 B 6 4.5 3 3 2 A 3 4 -2 4 2 B 5 4 2 5 3 A 6 NA NA 6 4 B 7 NA NA 7 5 A 0 2 -4 8 5 B 4 2 4 9 6 B 4 NA NA
如果需要和示例输出的列名完全一致(比如FAMID2、IID2、Value2),可以添加重命名步骤:
df_result <- df %>% rename(FAMID2 = FAMID, IID2 = IID, Value2 = Value) %>% group_by(FAMID2) %>% mutate( n_members = n(), Mean = ifelse(n_members == 2, mean(Value2), NA), DiffValue = ifelse(n_members == 2, Value2 - Mean, NA) ) %>% select(-n_members) %>% ungroup()
内容的提问来源于stack exchange,提问作者JuanJMV
相关产品推荐
相关产品推荐

