【问题标题】:Max by Group with Condition for a data.table带条件的数据表的最大组
【发布时间】:2019-02-27 17:55:47
【问题描述】:

我有这样的数据:

library(data.table)
group <- c("a","a","a","b","b","b")
cond <- c("N","Y","N","Y","Y","N")
value <- c(2,1,3,4,2,5)

dt <- data.table(group, cond, value)

group cond value
a     N    2
a     Y    1
a     N    3
b     Y    4
b     Y    2
b     N    5

我想在整个组的条件为 Y 时返回最大值。像这样的:

group cond value max
a     N    2     1
a     Y    1     1
a     N    3     1
b     Y    4     4
b     Y    2     4
b     N    5     4

我尝试将 ifelse 条件添加到分组最大值,但是,当行不满足条件时,我最终只返回 NA 的 no 条件:

dt[, max := ifelse(cond=="Y", max(value), NA), by = group]

【问题讨论】:

  • 试试dt[, max := if(all(cond == "Y")) max(value) else NA, by = group]
  • 返回了 NA 值的最大列。
  • 根据你的描述would like to return max value when the cond is Y for the entire group.,在例子中不是分组,'a'和'b'都有'N'
  • 我觉得你需要dt[, max := max(value[cond == 'Y']), group]

标签: r data.table


【解决方案1】:

假设对于每个“组”,我们需要获取“值”的max,其中“条件”为“Y”,在按“组”分组后,使用逻辑条件(@ 987654322@) 并获取max

dt[, max := max(value[cond == 'Y']), by = group]
dt
#   group cond value max
#1:     a    N     2   1
#2:     a    Y     1   1
#3:     a    N     3   1
#4:     b    Y     4   4
#5:     b    Y     2   4
#6:     b    N     5   4

【讨论】:

  • @ericbrownaustin 可能你的实际数据集不是data.table 试试setDT(dt)
【解决方案2】:

你可以...

dt[CJ(group = group, cond = "Y", unique=TRUE), on=.(group, cond), 
  .(mv = max(value))
, by=.EACHI]

#    group cond mv
# 1:     a    Y  1
# 2:     b    Y  4

使用will eventually have 这样的连接优化max 计算。


另一种方式(最初包含在@akrun 的回答中):

dt[cond == "Y", mv := max(value), by=group]

从之前的链接我们可以看出,除了the := part之外,这种方式已经优化过了。

【讨论】:

  • 返回错误:[.data.frame(dt, CJ(group = group, cond = "Y", unique = TRUE) 中的错误,: 未使用的参数 (on = .(group, cond), by = .EACHI)
  • @ericbrownaustin 它适用于问题中的示例,因为dt 是一个data.table,而您正在使用data.frame 进行测试,也许?您可以使用setDT(dt)进行调整。
猜你喜欢
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 2014-12-04
  • 2015-10-08
相关资源
最近更新 更多