如何用分组if else筛选器剔除占比不足50%的变量关联行
问题解决:按分组筛选符合自关联占比要求的变量行
我有一份记录变量X1与X2间不同类型关联的数据集,需要按分组剔除占比低于50%的变量:
- 判断规则:按分组计算变量自关联(X1=X2的行)的
Tlinks与组内最大Tlinks的比值,若比值小于0.5,则移除所有包含该变量的行 - 示例中A4的自关联比值(15/71≈21%)不足50%,因此要移除所有含A4的行
原始数据集:
dat <- read.table(text = " group X1 X2 `++` `--` `+-` `-+` `0+` `+0` `0-` `-0` `00` Tlinks 1 52 A1 A1 0 6 0 0 0 0 0 0 65 71 2 52 A2 A1 0 0 0 0 0 0 0 0 71 71 3 52 A2 A2 0 0 0 0 0 0 0 0 71 71 4 52 A3 A1 0 0 0 0 0 13 0 3 55 71 5 52 A3 A2 0 0 0 0 0 0 0 0 71 71 6 52 A3 A3 0 20 0 0 0 0 0 0 51 71 7 52 A4 A1 0 0 0 0 0 0 0 0 71 71 8 52 A4 A2 0 0 0 0 0 0 0 0 71 71 9 52 A4 A3 0 0 0 0 0 0 0 0 71 71 10 52 A4 A4 0 0 0 0 0 0 0 0 15 15 ", header = TRUE)
当前尝试的代码无法实现需求:
dat2 <- dat %>% group_by(group) %>% filter(if(X1 == X2 & Tlinks/max(Tlinks) > 0.50) X1 | X2 else TRUE)
解决思路
- 按分组计算组内最大
Tlinks值 - 筛选出自关联行(X1=X2),计算每个变量的
Tlinks与组内最大值的比值 - 提取比值≥0.5的合格变量列表
- 保留原始数据集中X1或X2属于合格变量的行
正确代码
library(dplyr) dat2 <- dat %>% group_by(group) %>% # 计算组内最大Tlinks mutate(max_tlinks = max(Tlinks)) %>% # 筛选自关联行,保留比值达标变量 filter(X1 == X2, Tlinks/max_tlinks >= 0.5) %>% # 提取合格变量列表 pull(X1) %>% # 过滤原始数据,保留含合格变量的行 { filter(dat, X1 %in% . | X2 %in% .) }
或者更简洁的链式写法:
dat2 <- dat %>% group_by(group) %>% mutate(max_t = max(Tlinks)) %>% filter(X1 == X2, Tlinks/max_t >= 0.5) %>% distinct(X1) %>% pull(X1) %>% filter(dat, X1 %in% ., X2 %in% .)
验证结果
运行后得到的dat2与目标数据集完全一致:
# group X1 X2 ++ -- +- -+ 0+ +0 0- -0 00 Tlinks # 1 52 A1 A1 0 6 0 0 0 0 0 0 65 71 # 2 52 A2 A1 0 0 0 0 0 0 0 0 71 71 # 3 52 A2 A2 0 0 0 0 0 0 0 0 71 71 # 4 52 A3 A1 0 0 0 0 0 13 0 3 55 71 # 5 52 A3 A2 0 0 0 0 0 0 0 0 71 71 # 6 52 A3 A3 0 20 0 0 0 0 0 0 51 71
内容的提问来源于stack exchange,提问作者Hard_Course
相关产品推荐
相关产品推荐

