【问题标题】:flag row with the maximum number in each row每行中具有最大数量的标志行
【发布时间】:2020-07-08 17:44:53
【问题描述】:

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

假设我想分别为每个 ID 查找 Value 中的最大值。然后用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

有什么想法吗?

【问题讨论】:

  • 我认为第 6 个值应该是 0,因为值是 17 而不是 8 的最大值
  • ifelse() 采用逻辑向量...检查 ?ifelse.

标签: r if-statement data.table


【解决方案1】:

使用data.table,我们可以按“ID”分组,用(as.integer+)将逻辑向量强制为二进制并分配(:=)输出以创建新列“flagMAX”

library(data.table)
DF[, flagMAX := +(Value == max(Value)), ID]

如果我们同时按“ID”和“事件”分组

DF[, flagMAX := +(Value == max(Value)), by = .(ID, Event)]

在 OP 的代码中,ifelse 'test' 参数不是逻辑向量,而是来自max(Value) 的单个数值,这被强制转换为逻辑值,导致任何大于 0 的值都为 TRUE 和其他 FALSE。因此,整个结果为 1

下图

DF[, max(Value), ID]
#   ID V1
#1:  1  5
#2:  2 17
#3:  3  5

现在,我们将其强制为合乎逻辑的

DF[, as.logical(max(Value)), ID]
#   ID   V1
#1:  1 TRUE
#2:  2 TRUE
#3:  3 TRUE

当我们用ifelse(TRUE, 1, 0)进行赋值时,它返回全1。如果我们有一个0值作为最大值,它返回FALSE

as.logical(c(5, 17, 5, 0))
#[1]  TRUE  TRUE  TRUE FALSE

【讨论】:

    【解决方案2】:

    如果您接受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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 2018-09-07
      • 2018-12-19
      • 2015-07-07
      相关资源
      最近更新 更多