如何用R计算Bin分组内二进制列间1的位置切换次数
按Bin分组计算列间1的切换次数
原始数据
data <- data.frame( COL_A = c(1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1), COL_B = c(0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0), Bin = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4))
需求
按Bin列分组,统计每组内1从COL_A转移到COL_B(或反向转移)的次数,给原数据框新增一列number_of_switches,每组内该列值保持一致。切换不要求两行连续,只要组内1的所在列发生变化即计数。
期望结果
data <- data.frame( COL_A = c(1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1), COL_B = c(0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0), Bin = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4), number_of_switches = c(1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3))
解决方案
使用dplyr包实现分组统计,步骤如下:
- 标记每行中1所在的列,全0行标记为NA;
- 过滤掉全0行,保留有1的行;
- 统计组内1所在列的相邻变化次数,即切换次数;
- 将统计结果合并回原数据框,确保每组所有行对应相同的切换次数。
代码实现:
library(dplyr) data_result <- data %>% group_by(Bin) %>% # 标记1所在的列 mutate(current_col = case_when( COL_A == 1 ~ "A", COL_B == 1 ~ "B", TRUE ~ NA_character_ )) %>% # 筛选有1的行 filter(!is.na(current_col)) %>% # 计算切换次数:相邻列不同的次数之和 summarise(number_of_switches = sum(current_col != lag(current_col), na.rm = TRUE)) %>% # 合并回原数据 right_join(data, by = "Bin") %>% # 调整列顺序与期望结果一致 select(COL_A, COL_B, Bin, number_of_switches) %>% arrange(Bin) # 查看结果 print(data_result)
运行上述代码后,得到的data_result与期望结果完全一致。
内容的提问来源于stack exchange,提问作者akshit singh
相关产品推荐
相关产品推荐

