在R中基于X1与name列的变量总计数过滤行
解决方法:筛选X1和name列中值总出现次数≥3的行
你的需求是统计X1和name两列所有值的出现频次,保留那些行中X1或name属于频次≥3的取值的行。之前的代码错误在于按X1,name组合分组,每个组合在原数据里最多只有1行,因此n()始终为1,自然筛选不出结果。
步骤说明
- 提取X1和name列的所有值,统一统计每个值的出现次数
- 筛选出出现次数≥3的目标值集合
- 过滤原数据,保留X1或name属于上述高频值的行
代码实现
library(dplyr) library(tidyr) # 原数据集 d <- read.table(text = " X1 name var1 var2 var3 A1 A1 0 9 0 A3 A3 0 7 0 A4 A4 0 11 0 A5 A5 0 7 0 A6 A6 0 8 0 D D 0 11 0 IN A5 0 0 11 IN IN 0 11 0 ", header = TRUE) # 统计X1和name列所有值的出现频次,筛选出频次≥3的值 high_freq_vals <- d %>% select(X1, name) %>% pivot_longer(cols = everything(), values_to = "val") %>% count(val) %>% filter(n >= 3) %>% pull(val) # 过滤得到目标结果 result <- d %>% filter(X1 %in% high_freq_vals | name %in% high_freq_vals) print(result)
输出结果
X1 name var1 var2 var3 1 A5 A5 0 7 0 2 IN A5 0 0 11 3 IN IN 0 11 0
代码解释
- 用
pivot_longer将X1和name列转换为长格式,实现对两列所有值的统一统计 count(val)计算每个值的总出现次数,筛选出频次≥3的取值存入high_freq_vals- 最后通过
filter保留原数据中X1或name属于高频值集合的行
内容的提问来源于stack exchange,提问作者Hard_Course
相关产品推荐
相关产品推荐

