我正在try 使用dplyr过滤数据帧,但我真的想不出一种方法来实现我想要的.我有一个以下形式的数据框:

A    B    C
-----------
1    2    5
1    4    6
2    2    7
2    4    6

A中的每个值恰好出现两次.列B恰好有2个不同的值,每个值都恰好出现一次.列C可以具有任何正值.我希望保留以下所有行:对于一个值为A的行,具有较大B值的行比具有较小B值的行具有较小的C值.在上面的示例中,这将导致:

A    B    C
-----------
2    2    7
2    4    6

有没有办法使用dplyr实现这一点?

推荐答案

1)按A和B排序以确保较大的B始终是A中的第二个,然后按A分组使用基于diff(C)<;0的筛选器.

library(dplyr)

DF %>%
  arrange(A, B) %>%
  group_by(A) %>%
  filter((diff(C) < 0)) %>%
  ungroup
## # A tibble: 2 × 3
##       A     B     C
##   <int> <int> <int>
## 1     2     2     7
## 2     2     4     6

2)另一种可能性是确保B的最大值与C的最小值在同一行.这也适用于非数字数据.

关于这个问题的另一个 idea ,请看下面的 comments .

DF %>%
  group_by(A) %>%
  filter(which.max(B) == which.min(C)) %>%
  ungroup

3)如果B相对于C的斜率为负,则保持该组.

DF %>%
  group_by(A) %>%
  filter(coef(lm(B ~ C))[[2]] < 0) %>%
  ungroup

或者我们可以自己计算斜率:

DF %>%
  group_by(A) %>%
  filter(diff(C) / diff(B) < 0) %>%
  ungroup

注意事项

Lines <- "A    B    C
1    2    5
1    4    6
2    2    7
2    4    6"

DF <- read.table(text = Lines, header = TRUE)

R相关问答推荐

MCMC和零事件二元逻辑回归

如何使用`ggplot2::geom_segment()`或`ggspatial::geom_spatial_segment()`来处理不在格林威治中心的sf对象?

根据多个条件增加y轴高度以适应geom_text标签

将数据集中的值增加到当前包含的最大值

错误:非常长的R行中出现意外符号

可以替代与NSE一起使用的‘any_of()’吗?

有效识别长载体中的高/低命中

无法正确设置动态创建的Quarto标注的格式

使用Scale_*_MANUAL时在图例中保留未使用的系数级别

如何使用前缀作为匹配来连接数据帧?

如何在反曲线图中更改X标签

SHILINY中DT列的条件着色

如何为混合模型输出绘制不同的线型?

通过R:文件名未正确写入[已解决]将.nc文件转换和导出为.tif文件

TidyVerse中长度不等的列结合向量

如何使用包metaviz更改标签的小数位数?

位置_道奇在geom_point图中不躲避

根据小时-分钟列创建年-月-日序列

As.Date()不适用于5月或10月日期

使用for()循环将数据处理应用于数据集的所有行