使用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 == col2
或col1 == col2+-2
在这里我应该得到:
Groups_name col1 col2
group1 3 4
group1 1 1
group1 1 1
group4 3 3
group4 1 1
如您所见,我保留了group1
,因为第一行中的col1 >1
和col1 (3) = col2 +1 (4)
我还保留group 3
,因为col1 >1
和col1 (3) == col2 (3)
但是group 1
被删除是因为col1
是not > 1
我还删除了group 3
,因为即使col1 (3) > 1
,col1 (3)
也不等于7 +
或- 2
(所以不等于{{ 1}}或5,6,7,8
)
从现在开始,我尝试:
9
感谢您的帮助。
答案 0 :(得分:2)
我们可以通过以下方式使用any
和all
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且col1
和col2
之间的绝对差始终在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))