在R中使用dplyr子集数据帧

时间:2019-05-01 09:15:56

标签: r dplyr

使用R我正在尝试根据一些参数来过滤我的数据框。

以下是数据框:

Groups_name  col1   col2
group1       3       4
group1       1       1
group1       1       1
group2       1       1
group3       3       7
group3       1       1
group4       3       3
group4       1       1

按组,我只希望保留包含至少一行的组,其中col1 > 1以及col1 == col2col1 == col2+-2

在这里我应该得到:

Groups_name  col1   col2
group1       3      4
group1       1      1
group1       1      1
group4       3      3
group4       1      1

如您所见,我保留了group1,因为第一行中的col1 >1col1 (3) = col2 +1 (4) 我还保留group 3,因为col1 >1col1 (3) == col2 (3)

但是group 1被删除是因为col1not > 1

我还删除了group 3,因为即使col1 (3) > 1col1 (3)也不等于7 +- 2(所以不等于{{ 1}}或5,6,7,8

从现在开始,我尝试:

9

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我们可以通过以下方式使用anyall

library(dplyr)
df %>%
  group_by(Groups_name) %>%
  filter(any(col1 > 1) & all(abs(col1 - col2) %in% 0:2))

#  Groups_name  col1  col2
#  <fct>       <int> <int>
#1 group1          3     4
#2 group1          1     1
#3 group1          1     1
#4 group4          3     3
#5 group4          1     1

这将选择col1中至少有一个大于1且col1col2之间的绝对差始终在0和2之间的组。

答案 1 :(得分:1)

我们可以在data.table

中完成此操作
library(data.table)
setDT(df)[, .SD[any(col1 >1) & all(abs(col1 - col2) %in% 0:2)], .(Groups_name)]
#   Groups_name col1 col2
#1:      group1    3    4
#2:      group1    1    1
#3:      group1    1    1
#4:      group4    3    3
#5:      group4    1    1

数据

df <- structure(list(Groups_name = c("group1", "group1", "group1", 
"group2", "group3", "group3", "group4", "group4"), col1 = c(3L, 
1L, 1L, 1L, 3L, 1L, 3L, 1L), col2 = c(4L, 1L, 1L, 1L, 7L, 1L, 
3L, 1L)), class = "data.frame", row.names = c(NA, -8L))