You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在长格式数据集中计算家庭内的差值与均值变量

解决方案

可以用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:27:25