计算3个事件同时发生次数及扩展至多事件的R语言实现方法
计算多事件同时发生的次数(3个及以上)
给定仅包含0/1取值的事件数据集(1表示事件发生,0表示未发生):
df <- data.frame(event1 = c(1, 0, 0, 1, 0, 0, 1), event2 = c(1, 1, 0, 1, 0, 0, 1), event3 = c(1, 0, 0, 0, 0, 0, 0), event4 = c(0, 1, 1, 0, 1, 0, 0), event5 = c(0, 1, 0, 1, 0, 1, 1), event6 = c(1, 0, 0, 0, 0, 0, 0))
统计3个事件同时发生的次数
通过以下步骤实现需求:
- 生成所有3个事件的不重复组合
- 对每个组合统计同一行中三个事件均为1的记录数
- 整理为易读的格式
代码实现
# 生成所有3个事件的组合 event_triples <- combn(names(df), 3, simplify = FALSE) # 计算每个三元组的同时发生次数 counts <- sapply(event_triples, function(triple) { # 行和等于3意味着三个事件都为1 sum(rowSums(df[triple]) == 3) }) # 整理为数据框格式 result_df <- data.frame( 事件组合 = sapply(event_triples, paste, collapse = ", "), 发生次数 = counts ) # 或者整理为矩阵格式 result_matrix <- matrix(counts, ncol = 1, dimnames = list(sapply(event_triples, paste, collapse = ", "), "发生次数"))
运行后可得到你提到的结果:比如event1, event2, event3的发生次数为1,event2, event4, event5的发生次数为1。
扩展到k个事件(k>3)
上述逻辑可直接扩展到任意k个事件的情况,只需将combn函数中的3替换为目标k值即可:
代码示例(以k=4为例)
# 设置目标事件数量 k <- 4 # 生成所有k个事件的组合 event_k_combs <- combn(names(df), k, simplify = FALSE) # 计算每个组合的同时发生次数 k_counts <- sapply(event_k_combs, function(comb) { sum(rowSums(df[comb]) == k) }) # 整理结果 k_result_df <- data.frame( 事件组合 = sapply(event_k_combs, paste, collapse = ", "), 发生次数 = k_counts )
逻辑说明
combn(names(df), k):生成数据集中所有k个事件的不重复组合rowSums(df[comb]) == k:判断某一行中该组合的所有事件是否都为1(行和等于k)sum():统计满足条件的总行数,即该事件组合同时发生的次数
你之前查询的两个事件同时发生的统计,本质就是k=2的情况,完全适用这套逻辑。
内容的提问来源于stack exchange,提问作者user19611357
相关产品推荐
相关产品推荐

