【问题标题】:Filter by group max combination of values in a given order按给定顺序按组最大组合值过滤
【发布时间】:2016-12-13 14:17:11
【问题描述】:

我想按组过滤,即基于给定列顺序的值的最大组合。

列向量应指定查看最大值的列的顺序。

例如:

x <- data.frame(id = c("a", "a", "b", "b"), 
                x = c(1, 1, 1, 2), 
                y = c(1, 2, 2, 1), 
                z = c(1, 1, 2, 1))

> x
  id x y z
1  a 1 1 1
2  a 1 2 1
3  b 1 2 2
4  b 2 1 1

在此示例中,我想按id 分组并将“优先级”设置为x, y, z,这意味着我想查看最大x 值,然后它与最大y 值相关联,然后是最大z 值是最大x, y 对。

我不知道这样的矢量化函数,所以我递归分组以找到最大的以下列最大值:

> x
  id x y z
1  a 1 2 1
2  b 2 1 1

我可以用基础 R 做一个循环:

group <- "id"
cols <- c("x", "y", "z")

for (i in seq_along(cols)) {
  tmp <- aggregate(setNames(list(x[[cols[i]]]), cols[i]), by = as.list(x[group]), FUN = max)
  x <- merge(x, tmp, by = c(group, cols[i]))
  group <- c(group, cols[i])
}

x <- x[!duplicated(x), ]

> x
  id x y z
1  a 1 2 1
2  b 2 1 1

我想将其应用于大量数据,因此此代码在某些时候会遇到困难。您有什么想法可以改进吗?

感谢您的帮助!

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以试试dplyr

    library(dplyr)
    x %>% 
       group_by(id) %>% 
       arrange(desc(y),desc(z)) %>% 
       slice(which.max(x))
    #     id     x     y     z  
    #   <fctr> <dbl> <dbl> <dbl>
    #1      a     1     2     1
    #2      b     2     1     1
    

    【讨论】:

      【解决方案2】:

      这是使用拆分-应用-组合方法的基本 R 解决方案。

      dfNew <- do.call(rbind, lapply(split(x, x$id),
                                     function(x) x[with(x, order(x, y, z, decreasing=TRUE))[1],]))
      

      返回

      dfNew    
        id x y z
      a  a 1 2 1
      b  b 2 1 1
      

      split 按 id 拆分数据帧并返回一个列表,该列表被馈送到lapply,然后应用一个匿名函数返回根据order 具有最大值的行。最后,单行data.frames列表附加rbinddo.call

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-06
        • 1970-01-01
        • 2023-02-24
        • 2016-06-11
        • 1970-01-01
        • 2021-11-14
        • 2016-10-09
        • 2012-11-30
        相关资源
        最近更新 更多