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

基于R语言计算群体成员历史共同组参与次数的实现

问题描述

现有一份记录个体组归属的数据,包含字段:ID(个体ID)、GROUP_NUM(组编号)、Date(组创建日期)。需要编写R代码新增HistoryCount列,统计每个成员与当前组内其他成员在更早创建的组中共同参与的次数。

示例数据框

IDGROUP_NUMDate
abc12022-01-15
def12022-01-15
ghi12022-01-15
jkl12022-01-15
abc22022-02-19
mno22022-02-19
pqr22022-02-19
stv22022-02-19
abc32022-05-11
stv32022-05-11
wxy32022-05-11
zzz32022-05-11
abc42022-10-06
def42022-10-06
pqr42022-10-06
bbb42022-10-06
abc52021-04-14
stv52021-04-14
pqr52021-04-14
bbb52021-04-14

期望结果

IDGROUP_NUMDateHistoryCount
abc12022-01-150
def12022-01-150
ghi12022-01-150
jkl12022-01-150
abc22022-02-191
mno22022-02-190
pqr22022-02-191
stv22022-02-191
abc32022-05-112
stv32022-05-112
wxy32022-05-110
zzz32022-05-110
abc42022-10-064
def42022-10-061
ddd42022-10-060
stv42022-10-063
abc52021-04-140
stv52021-04-140
pqr52021-04-140
ccc52021-04-140

参考代码(原方案)

此前@akrun提供的方案仅能识别存在历史共同组成员的群体,代码如下:

library(dplyr)
df1 %>%
  group_by(ID) %>% 
  mutate(indx = n_distinct(GROUP_NUM)) %>%
  ungroup %>% 
  mutate(indx = indx * (duplicated(ID))) %>%
  group_by(GROUP_NUM) %>%
  mutate(HISTORY = +((indx > 0) & (sum(indx > 0) > 1)), indx = NULL) %>%
  ungroup

解决方案

要实现个体级别的历史共同组次数统计,需按时间顺序筛选更早的组,再统计每个个体与当前组其他成员的共同组数量。以下是基于dplyr和tidyr的实现代码:

library(dplyr)
library(tidyr)

# 将Date转换为日期类型,确保时间比较准确
df <- df %>%
  mutate(Date = as.Date(Date))

# 生成个体与当前组其他成员的历史共同组记录
common_history <- df %>%
  # 为每个组记录所有成员的列表
  group_by(GROUP_NUM, Date) %>%
  mutate(group_members = list(ID)) %>%
  ungroup() %>%
  # 对每一行,筛选出当前组之前创建的所有组数据
  rowwise() %>%
  mutate(prev_groups_data = list(filter(df, Date < !!Date))) %>%
  ungroup() %>%
  # 展开历史组数据,匹配当前组内的成员
  unnest(prev_groups_data) %>%
  filter(ID %in% group_members) %>%
  # 统计每个个体在当前组中的历史共同组数量(去重)
  group_by(ID, GROUP_NUM, Date) %>%
  summarise(HistoryCount = n_distinct(prev_groups_data$GROUP_NUM), .groups = "drop")

# 合并统计结果到原数据,未找到历史共同组的个体填充0
final_result <- df %>%
  left_join(common_history, by = c("ID", "GROUP_NUM", "Date")) %>%
  mutate(HistoryCount = replace_na(HistoryCount, 0))

print(final_result)

代码说明

  1. 日期转换:将Date转为日期类型,避免字符串比较导致的错误。
  2. 组成员列表:为每个组生成成员列表,用于后续匹配当前组内的其他成员。
  3. 历史组筛选:对每个组,仅保留创建时间更早的组数据,确保统计范围符合要求。
  4. 共同组统计:对每个个体,统计其在历史组中与当前组其他成员共同参与的不同组数量,去重避免重复计数。
  5. 结果合并:将统计结果合并回原数据,缺失值填充为0,保证所有个体都有HistoryCount值。

内容的提问来源于stack exchange,提问作者iwuzborn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:25:37