R-dplyr-基于多个条件筛选顶行 嗨,这是我的第一篇帖子,

R-dplyr-基于多个条件筛选顶行 嗨,这是我的第一篇帖子,,r,dplyr,R,Dplyr,我希望它是正确的和可复制的 我想知道是否有比我下面的方法更优雅的解决方案 我有一个数据帧,希望使用条件过滤器并提取满足这些条件的行 作为输出,我希望顶部的行满足条件条件条件(不同列的顶部输出条件不同),同时保留所有其他列。 数据帧示例: set.seed(123) df1 <- data.frame( A = as.numeric(1:10), B = sample(seq(as.Date('2000/01/01'), as.Date('2018/01/01'), by="d

我希望它是正确的和可复制的

我想知道是否有比我下面的方法更优雅的解决方案

我有一个数据帧,希望使用条件过滤器并提取满足这些条件的行

作为输出,我希望顶部的行满足条件条件条件(不同列的顶部输出条件不同),同时保留所有其他列。

数据帧示例:

 set.seed(123)
  df1 <- data.frame(
  A = as.numeric(1:10),
  B = sample(seq(as.Date('2000/01/01'), as.Date('2018/01/01'), by="day"), size=10),
  C = as.numeric(sample(20:90, size = 10)),
  D = sample(c("yes", "no"), size=10, replace = TRUE),
  E = as.numeric(sample(1000:2000, size = 10))
)


df1 #check output

> df1 #check output
    A          B  C   D    E
1   1 2005-03-06 87  no 1963
2   2 2014-03-11 51  no 1902
3   3 2007-05-12 66  no 1690
4   4 2015-11-22 58  no 1793
5   5 2016-12-02 26  no 1024
6   6 2000-10-26 79  no 1475
7   7 2009-07-01 35  no 1754
8   8 2016-01-19 22  no 1215
9   9 2009-11-30 40 yes 1315
10 10 2008-03-17 85 yes 1229
set.seed(123)
df1 df1#检查输出
A、B、C、D、E
12005-03-0687第1963号
2 2014-03-11 51第1902号
3 2007-05-12 66第1690号
4 2015-11-22 58第1793号
5 2016-12-02 26第1024号
6 2000-10-26 79第1475号
7 2009-07-01第35号1754
8 2016-01-19 22第1215号
9 2009-11-30 40是1315
10 2008-03-17 85是1229
我想用于筛选的条件:

A) 如果列E在1000和1500之间,返回列A上的前2行加权值

B) 如果列E在1000和2000之间,则返回列B上加权的前2行

C) 如果列E在1000和1400之间,返回列C上的前2行加权值

我提出了以下解决方案,但它很麻烦,我想知道是否有更好的方法

library("dplyr")
library("tidyr")
A<- df1 %>% dplyr::filter(E >= 1000 & E <= 1500) %>% top_n( n = 2, wt = A)  %>% arrange(-A) %>% mutate(condition = "-cond_A")
B<- df1 %>% dplyr::filter(E >= 1000 & E <= 2000) %>% top_n( n = 2, wt = B) %>% arrange(B) %>% mutate(condition = "cond_B")
C<- df1 %>% dplyr::filter(E >= 1000 & E <= 1400) %>% top_n( n = 2, wt = C) %>% arrange(-C) %>% mutate(condition = "-cond_C")
库(“dplyr”)
图书馆(“tidyr”)
A%dplyr::过滤器(E>=1000&E%top\u n(n=2,wt=A)%%>%arrange(-A)%%>%mutate(condition=“-cond\u A”)
B%dplyr::过滤器(E>=1000&E%top\n(n=2,wt=B)%%>%arrange(B)%%>%mutate(condition=“cond\u B”)
C%dplyr::过滤器(E>=1000&E%top\u n(n=2,wt=C)%%>%arrange(-C)%%>%mutate(condition=“-cond\u C”)
我期望的输出如下:

spread(as.data.frame(distinct(bind_rows(A,B,C))),condition, condition)

   A          B  C   D    E -cond_A -cond_C cond_B
1  5 2016-12-02 26  no 1024    <NA>    <NA> cond_B
2  8 2016-01-19 22  no 1215    <NA>    <NA> cond_B
3  9 2009-11-30 40 yes 1315 -cond_A -cond_C   <NA>
4 10 2008-03-17 85 yes 1229 -cond_A -cond_C   <NA>
排列(如.data.frame(不同的(绑定行(A、B、C))),条件,条件)
A B C D E-cond_A-cond_B
1 5 2016-12-02 26第1024条条件B
2 8 2016-01-19 22第1215号条件B
3 9 2009-11-30 40是1315-一次-二次C
4 10 2008-03-17 85是1229-续A-续C

如果你能告诉我一个更好的方法,那就太好了!我们可以使用
purr
中的
map2
来循环
太好了,非常感谢

在我的评论中,我问你是否可以为map2提供更多的参数,我意识到pmap可以做到这一点

pmap(list(c(1500, 2000, 1400), c(1000, 1700, 1300), names(df1)[1:3]),
     ~ df1 %>%
       filter(E >= ..2 & E <= ..1) %>%
       top_n(n=2, wt = !! rlang::sym(..3)) %>% 
       arrange_at(..3, funs(desc(.))) %>%
       mutate(condition = paste0("-cond", ..3)))  %>%
  bind_rows %>% 
  distinct %>% 
  spread(condition, condition) 
pmap(列表(c(150020001400),c(100017001300),名称(df1)[1:3]),
~df1%>%
过滤器(E>=…2&E%
顶部(n=2,wt=!!rlang::sym(…3))%>%
安排在(…3,funs(desc(.))%>%
突变(条件=0(“-cond”,…3))%>%
绑定_行%>%
不同%>%
蔓延(条件,条件)

谢谢,akrun!这看起来很简洁,我需要学习更多关于map2的知识。另外,你能解释一下最上面的(n=2,wt=!!rlang::sym(.y))行吗?另外,如果下限(1000)不总是一样的话,是否可以修改?例如,如果我想要1000-1500和1200-2000以及1300-1400?@Moe看起来你已经弄明白了
pmap(list(c(1500, 2000, 1400), c(1000, 1700, 1300), names(df1)[1:3]),
     ~ df1 %>%
       filter(E >= ..2 & E <= ..1) %>%
       top_n(n=2, wt = !! rlang::sym(..3)) %>% 
       arrange_at(..3, funs(desc(.))) %>%
       mutate(condition = paste0("-cond", ..3)))  %>%
  bind_rows %>% 
  distinct %>% 
  spread(condition, condition)