【问题标题】:Filter rows within data.table group if max group value > some value [duplicate]如果最大组值>某个值[重复],则过滤 data.table 组中的行
【发布时间】:2020-01-02 00:24:22
【问题描述】:

如果该组中的最大值大于某个值,我正在尝试过滤 data.table 中组中的所有行。以下是我将如何在 DPLY 中执行此操作,以及如何在 data.table 中分两步使其工作。

#DPLYR 
df<-data.table(
  x =1:12
  ,y = 1:3
)

df %>% group_by(y) %>% 
  filter(max(x) < 11)

##data.table
df[,max_value :=max(x),by=y][max_value<11]

The output should be

    x y
1:  1 1 
2:  4 1 
3:  7 1 
4: 10 1

有没有一种方法可以一步完成,而无需在我的数据集中创建列?我所能找到的只是对组进行子集化以获得组内的一个特定值,而不是返回组中满足条件的所有行。

【问题讨论】:

  • 在这种情况下,最好提供一些所需输出的图片。只是df吗?
  • 刚刚更新了它,但是,是 df 的一个子集,其中只有满足该条件的组值。
  • 您可以添加[,-3],即使它并不能真正回答您的问题。 df[,max_value :=max(x),by=y][max_value&lt;11][,-3]
  • 是的,我的意思是,理想情况下,我不必为了删除它而创建第二列,但我可以通过 [,-length(colnames(df)-1] 来概括它。
  • 是的,很抱歉,我不知道 data.table 中有一种不需要那么多代码的方法。

标签: r data.table


【解决方案1】:

我们可以使用.I获取行索引,提取索引列和子集

df[df[, .I[max(x) < 11], y]$V1]
#    x y
#1:  1 1
#2:  4 1
#3:  7 1
#4: 10 1

或者另一个选项是.SD

df[, .SD[max(x) < 11], y]

【讨论】:

  • 我想说这个问题需要阿克伦哈哈。我不知道我们可以用.I 做到这一点,我想我得再看看那些备忘单。我不是 OP,但我很好奇,你知道用 base R 做这个的方法吗?谢谢。
  • @Gainz 在base R,我想df[with(df, ave(x, y, FUN = max) &lt; 11),]
  • 谢谢 Akrun,我可以使用 df[with(df, ave(x, y, FUN = function(x) max(x)) &lt; 11),]
  • @Gainz 无论哪种方式都可以。它。我通过避免匿名呼叫使其紧凑
  • 是的,我的错,当我尝试您的代码时,由于与 Global Environment 相关的某些内容而出现错误,您的答案非常有效。
猜你喜欢
  • 2018-11-16
  • 2012-08-17
  • 2020-08-04
  • 2020-10-13
  • 2015-02-16
  • 1970-01-01
  • 2022-06-11
相关资源
最近更新 更多