【问题标题】:Group by followed by select only rows if its value in a particular column is less than its value from the same column如果特定列中的值小于同一列中的值,则 Group by 后跟仅选择行
【发布时间】:2017-07-24 12:04:22
【问题描述】:

我是 R 新手

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

[数据集示例]

所以我想按“ID”分组,然后忽略排名高于“15001”的特定“ID”的行 - 以黄色突出显示。

这是我迄今为止尝试过的:

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

[预期结果]

【问题讨论】:

  • 欢迎来到 SO。请查看how to ask a great reproducible R question。分享您的数据(不是作为图片,而是使用dput()作为明文)和您已经尝试过的代码。
  • group_by 是什么意思?因为在您的预期结果中,我只看到您订购了它?
  • 对于给定的“ID”,我有很多条目。所以我想忽略排名高于“15001”的特定“ID”的行 - 以黄色突出显示。
  • SS3% group_by(ID) %>% filter(any(DC== 15001) & any(SS1$rank DC== 15001 ]))
  • 请编辑问题的代码和数据而不是评论。

标签: r filter dplyr


【解决方案1】:

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

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)

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

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

【讨论】:

  • 排名是根据特定ID的修复日期生成的。 @志白
  • ??你期待不同的输出吗?
猜你喜欢
  • 2011-02-20
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多