【问题标题】:Find the value of a variable for the row within a group that is the maximum of another variable when grouping在分组时找到组内另一个变量的最大值的行的变量值
【发布时间】:2015-06-24 22:33:03
【问题描述】:

为令人费解的标题道歉。本质上,我是在 R 中聚合一些数据。

df <- data.frame(value1=c(1,2,3,4,5,6,7,8,9,10),
+                  value2=c(2,3,4,5,6,7,8,9,1,2), 
+                  group=c("a","b","a","b","a","b","a","b","a","c")) 
DT <- as.data.table(df)

生成的数据如下所示:

 value1 value2  group
    1   2   a
    2   3   b
    3   4   a
    4   5   b
    5   6   a
    6   7   b
    7   8   a
    8   9   b
    9   1   a
    10  2   c

我想使用 data.table 为具有最高 value2 的行的每一组找到 value1。

例如,上面的表格会变成:

new_val group
7      a
8      b
10     c

...因为 7 是 a 组中具有最大值 2 的行的 value1 的值,以此类推。

在创建具有许多分组操作的新数据表时,我很难做到这一点

我目前使用的代码如下:

DT[,list(
    rate_max_acct = max(value1(which.max(value2)))
    ),
  by=group] -> DT2

这不起作用——我试图做的是为每个 froup 选择 value2 为最大值的行,然后为该组找到 value1 的最大值,但它不起作用并引发以下错误:

  could not find function "value1"

很明显它认为我是在尝试应用一个函数,而不是在寻找一个对象。

这里的任何帮助将不胜感激,特别是如果我可以在这个列表中做到这一点——我正在一次做一堆分组操作,如果我能保留“xxx = yyy”语法,我会非常喜欢。

【问题讨论】:

  • 您在变量上使用了(,而不是value1( 中的[

标签: r data.table


【解决方案1】:

你可以这样做:

DT[,list(newval=value1[which.max(value2)]), group]
#   group newval
#1:     a      7
#2:     b      8
#3:     c     10

你不需要那么多max(value1[which.max(value2)]),因为which.max会给你value2最大的行的索引,你只需要value1[which.max(value2)]

【讨论】:

  • 谢谢!实际上,我只是在发布后才发现这一点,而这正是我所做的!我觉得写出整个问题有点愚蠢,但很高兴我现在知道如何做到这一点。 E:另外,谢谢你的澄清,这是有道理的
  • NP!实际上,我阅读了您的问题的一半,之后确实看到了您的代码,因此我的评论...!
【解决方案2】:

如果您正在寻找多个最大值,则可以对先前的答案进行简单扩展。

library(data.table) ; setkey(DT, group)
tmp <- DT[, .(value1[which(value2 == max(value2)), max(value2))], by = group]

这将为您提供三列 data.table,第一列是组标识符,第二列是所有变量 value1,其中 value2 达到最大值,第三列是最大值 value2group.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2021-09-29
    • 2023-02-25
    • 2013-09-14
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多