在R语言中按first列分组筛选second列正负值匹配的行
在R语言中按分组筛选含对应正负值的行
需求说明
按first列分组,仅保留每个分组内second列中存在对应正负值的行(即某值的相反数也出现在该分组的second列中)。
示例输入数据
# 创建first列 first <- c(1,2,3,4,5,6,7,1,1,2) # 创建second列 second <- c(88,52,-28,-19,39,86,-31,10,-88,-52) df <- data.frame(first, second)
期望输出结果
data.frame(first=c(1,2,1,2), second=c(88,52,-88,-52))
解决方案
使用dplyr包可以高效实现该需求,以下是两种可行写法:
方法一:分步筛选分组与行
# 若未安装dplyr先执行:install.packages("dplyr") library(dplyr) df_filtered <- df %>% group_by(first) %>% # 先筛选出存在对应正负值的分组 filter(any(-second %in% second)) %>% # 再筛选分组内有对应相反数的行 filter(abs(second) %in% abs(second)[-second %in% second]) print(df_filtered)
方法二:利用绝对值重复特性
df_filtered <- df %>% group_by(first) %>% # 仅保留绝对值重复的行(正负值同时存在时绝对值才会重复) filter(abs(second) %in% abs(second)[duplicated(abs(second))]) print(df_filtered)
结果验证
运行代码后输出如下,与期望结果一致:
# A tibble: 4 × 2 # Groups: first [2] first second <dbl> <dbl> 1 1 88 2 2 52 3 1 -88 4 2 -52
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

