r - 带有 dplyr 的条件过滤器
问题描述
这是一个数据框:
cluster_names Species values Nsp Nsp_MRCA Event NB_Event Nsp_losses
1 Group1 Sp1 1 3 3 1 2 0
2 Group1 Sp1 4 3 3 1 2 0
3 Group1 Sp2 78 NA NA 1 2 NA
4 Group1 Sp3 NA 3 12 2 2 9
5 Group1 Sp4 NA 3 3 2 2 0
6 Group2 Sp2 3 2 3 2 2 1
7 Group2 Sp3 9 2 40 2 2 38
8 Group2 Sp4 8 NA NA 2 2 NA
9 Group3 Sp1 9 2 2 1 1 0
10 Group3 Sp3 10 3 3 1 1 0
11 Group3 Sp3 12 3 20 1 1 17
12 Group3 Sp3 14 2 3 1 1 1
13 Group4 Sp4 23 3 112 1 1 109
14 Group5 Sp3 34 5 114 1 1 109
15 Group6 Sp4 2 3 3 1 1 0
我怎么能说deplyr
,只保留Groups
在哪里:
Nsp > 1
至少对于one row
Nsp == Nsp_MRCA
至少一排- 如果所有
Nsp_losses < 3
Nsp 都在 5 和 2 之间并且所有Nsp_losses < 20
- 一切
NB_Event
都必须是< 3
有了这样的过滤器,我应该得到一个新的 df :
cluster_names Species values Nsp Nsp_MRCA Event NB_Event Nsp_losses
1 Group1 Sp1 1 3 3 1 2 0
2 Group1 Sp1 4 3 3 1 2 0
3 Group1 Sp2 78 NA NA 1 2 NA
4 Group1 Sp3 NA 3 12 2 2 9
5 Group1 Sp4 NA 3 3 2 2 0
9 Group3 Sp1 9 2 2 1 1 0
10 Group3 Sp3 10 3 3 1 1 0
11 Group3 Sp3 12 3 20 1 1 17
12 Group3 Sp3 14 2 3 1 1 1
15 Group6 Sp4 2 3 3 1 1 0
细节:
Group1
被保留是因为介于Nsp
两者5
之间2
Nsp_losses < 20
Group2
被删除是因为Nsp_losses = 38
Group3
被保留是因为 介于Nsp
两者5
之间2
Nsp_losses < 20
Groups 4
并被5
删除,因为Nsp_losses = 38
Group6
保留,因为Nsp == Nsp_MRCA
至少一排
并且所有这些至少有一行 Nsp > 1
到目前为止,我尝试了以下代码:
tab %>%
group_by(cluster_names) %>%
mutate(NB_Event = max(Event,na.rm=TRUE)) %>%
filter(any(Nsp > 1 |is.na(Nsp))) %>%
filter(any(Nsp == Nsp_MRCA)) %>%
mutate(Nsp_losses = abs(Nsp - Nsp_MRCA)) %>%
filter(all(Nsp <=5 |is.na(Nsp)) & all(Nsp > 1 |is.na(Nsp) & all(Nsp_losses < 20 |is.na(Nsp_losses)))) %>%
这是数据框
structure(list(cluster_names = structure(c(1L, 1L, 1L, 1L, 1L,
2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 5L, 6L), .Label = c("Group1",
"Group2", "Group3", "Group4", "Group5", "Group6"), class = "factor"),
Species = structure(c(1L, 1L, 2L, 3L, 4L, 2L, 3L, 4L, 1L,
3L, 3L, 3L, 4L, 3L, 4L), .Label = c("Sp1", "Sp2", "Sp3",
"Sp4"), class = "factor"), values = c(1L, 4L, 78L, NA, NA,
3L, 9L, 8L, 9L, 10L, 12L, 14L, 23L, 34L, 2L), Nsp = c(3L,
3L, NA, 3L, 3L, 2L, 2L, NA, 2L, 3L, 3L, 2L, 3L, 5L, 3L),
Nsp_MRCA = c(3L, 3L, NA, 12L, 3L, 3L, 40L, NA, 2L, 3L, 20L,
3L, 112L, 114L, 3L), Event = c(1L, 1L, 1L, 2L, 2L, 2L, 2L,
2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), class = "data.frame", row.names = c(NA,
-15L))
感谢您的帮助和时间。
解决方案
The presence of NA
s makes it a bit tricky hence, I remove them first using na.omit
and find out groups (cluster_names
) which satisfy the conditions given and later filter
based on that.
library(dplyr)
tab %>%
filter(cluster_names %in% (tab %>%
na.omit() %>%
mutate(Nsp_losses = abs(Nsp - Nsp_MRCA)) %>%
group_by(cluster_names) %>%
filter(any(Nsp > 1 & Nsp == Nsp_MRCA) & all(Event < 3) &
(if(all(Nsp %in% 2:5)) all(Nsp_losses < 20) else all(Nsp_losses < 3))) %>%
pull(cluster_names) %>% unique))
# cluster_names Species values Nsp Nsp_MRCA Event
#1 Group1 Sp1 1 3 3 1
#2 Group1 Sp1 4 3 3 1
#3 Group1 Sp2 78 NA NA 1
#4 Group1 Sp3 NA 3 12 2
#5 Group1 Sp4 NA 3 3 2
#6 Group3 Sp1 9 2 2 1
#7 Group3 Sp3 10 3 3 1
#8 Group3 Sp3 12 3 20 1
#9 Group3 Sp3 14 2 3 1
#10 Group6 Sp4 2 3 3 1
推荐阅读
- python - python re.sub 行为在 3.7 中发生了变化。错误与否?
- php - 从 GET 请求中解析数据库表
- python - 当字符串从一个列表移动到另一个列表到 Python 中的第三个列表时,将逗号添加到字符串
- apache - 尽管 HUE 在端口 8000 上工作,但 Web HUE 未加载
- javascript - 如何提高 highcharts scatter 3d 性能
- java - 如何在不使用 DB 工具的情况下检测 Java 应用程序中的连接泄漏/打开连接
- c# - 将数据从内部网格视图传递到主网格视图(gridview 模板中的gridview)ASP.net C#
- mongodb - 使用 mongoDB 推入嵌套对象数组
- android - 在Android中使用画布在自定义视图(按钮)中绘制进度动画
- spring-data-jpa - 可以在 JPA 方法中使用的多个 In 子句