如果特定列中的值小于同一列中的值,则分组后跟仅选择行

时间:2017-07-24 12:04:23

标签: r filter dplyr

我是R的新手

我有一个数据框[1390 * 6],其中最后一个变量是等级。

[数据集示例] enter image description here

所以我想通过“ID”分组,然后忽略特定“ID”的行,其等级高于“15001” - 以黄色突出显示。

这是我到目前为止所尝试的:

SS3<-SS1 %>% group_by(ID) %>% filter(any(DC== 15001) & any(SS1$rank <SS1$rank[DC== 15001])) 

[预期结果]

enter image description here

1 个答案:

答案 0 :(得分:0)

与您提供的数据类似的示例,仅包含操作所需的相关行。 这应该适用于您自己的数据(根据您所显示的内容):

set.seed(1)
df <- data.frame(ID=c(rep(2122051,20),rep(2122052,20)),
                 DC=as.integer(runif(40)*100),
                rank=rep(1:20,2),
                 stringsAsFactors=F)
df$DC[c(10,30)] <- as.integer(15001)

我将每个位置的rank - 1存储为DC==15001作为向量

positions <- df$rank[df$DC==15001]
[1] 9 9

我使用tidyverse map2来存储rank小于positions每个群组中显示的条目。

library(tidyverse) 
df1 <- df %>%
          group_by(ID) %>%
          nest() %>%
          mutate(data = map2(data, 1:length(unique(df$ID)), ~head(.x,positions[.y]))) %>%
          unnest(data)

输出

        ID    DC  rank
 1 2122051    26     1
 2 2122051    37     2
 3 2122051    57     3
 4 2122051    90     4
 5 2122051    20     5
 6 2122051    89     6
 7 2122051    94     7
 8 2122051    66     8
 9 2122051    62     9
10 2122051 15001    10
11 2122052    93     1
12 2122052    21     2
13 2122052    65     3
14 2122052    12     4
15 2122052    26     5
16 2122052    38     6
17 2122052     1     7
18 2122052    38     8
19 2122052    86     9
20 2122052 15001    10