首页 > 解决方案 > 每行中具有最大数量的标志行

问题描述

这个问题的启发,我想知道如何按组标记具有最大数量的行,同时保留所有其他行,而不是删除它们?

Value可以说我想为每个ID单独寻找最大值。然后用 标记最大行,用 标记1所有其他行0

所以,基本上从中得到:

ID    <- c(1,1,1,2,2,2,2,3,3)
Value <- c(2,3,5,2,5,8,17,3,5)
Event <- c(1,1,2,1,2,1,2,2,2)
DF <- data.table(cbind(ID, Value, Event))
DF
   ID Value Event
1:  1     2     1
2:  1     3     1
3:  1     5     2
4:  2     2     1
5:  2     5     2
6:  2     8     1
7:  2    17     2
8:  3     3     2
9:  3     5     2

对此:

DF
   ID Value Event flagMAX
1:  1     2     1       0
2:  1     3     1       0
3:  1     5     2       1
4:  2     2     1       0
5:  2     5     2       0
6:  2     8     1       1
7:  2    17     2       1
8:  3     3     2       0
9:  3     5     2       0

如何才能做到这一点?理想情况下data.table

我试过了 :

DF[,flagMAX := ifelse(max(Value), 1, 0), by = "ID"]

但得到所有1

有任何想法吗?

标签: rif-statementdata.table

解决方案


如果您接受答案tidyverse

library(tidyverse)

ID    <- c(1,1,1,2,2,2,2,3,3)
Value <- c(2,3,5,2,5,8,17,3,5)
Event <- c(1,1,2,1,2,1,2,2,2)
DF <- data.frame(cbind(ID, Value, Event))

DF %>% 
  group_by(ID) %>% 
  mutate(flag = ifelse(Value == max(Value), 1,0))
#> # A tibble: 9 x 4
#> # Groups:   ID [3]
#>      ID Value Event  flag
#>   <dbl> <dbl> <dbl> <dbl>
#> 1     1     2     1     0
#> 2     1     3     1     0
#> 3     1     5     2     1
#> 4     2     2     1     0
#> 5     2     5     2     0
#> 6     2     8     1     0
#> 7     2    17     2     1
#> 8     3     3     2     0
#> 9     3     5     2     1

推荐阅读