【问题标题】:Identify and label the largest number in each group识别并标记每组中最大的数字
【发布时间】:2013-10-18 18:15:32
【问题描述】:

您好,我想确定并标记每个组的最大数字,有人可以告诉我如何在 r 中完成此操作(或者 Excel 会更容易)吗? 下面是一个示例数据,原始数据只包含左边两列,我想生成第三列。在第 3 列中,我想将组中的最大值标记为 1,例如,在第 1 组中,最大值为 0.02874,因此将其标记为 1,否则标记为 0。谢谢!

    x <- read.table(header=T, text="group value largest
    1 0.02827 0
    1 0.02703 0
    1 0.02874 1
    2 0.03255 0
    2 0.10394 1
    2 0.03417 0
    3 0.13858 0
    3 0.16084 0
    3 0.99830 1
    3 0.24563 0")

更新:谢谢大家的帮助!它们都是很好的解决方案!

【问题讨论】:

  • 你能告诉我们你尝试了什么吗?干杯。
  • 我们可以添加更多方法吗?不确定是否有足够的选项可供选择。

标签: r excel sorting max


【解决方案1】:

最后,基本(无需打包)方法:

is.largest <- function(x) as.integer(seq_along(x) == which.max(x))
x <- transform(x, largest = ave(value, group, FUN = is.largest))

请注意,如果我是你,我会删除 as.integer 并只存储一个逻辑 (TRUE/FALSE) 向量。

【讨论】:

    【解决方案2】:
    library(data.table)
    x <- data.table(x)
    
    y <- x[,list(value = max(value), maxindicator = TRUE), by = c('group')]
    
    z <- merge(x,y, by = c('group','value'), all = TRUE)
    

    输出

    > z
        group   value largest maxindicator
     1:     1 0.02703       0           NA
     2:     1 0.02827       0           NA
     3:     1 0.02874       1         TRUE
     4:     2 0.03255       0           NA
     5:     2 0.03417       0           NA
     6:     2 0.10394       1         TRUE
     7:     3 0.13858       0           NA
     8:     3 0.16084       0           NA
     9:     3 0.24563       0           NA
    10:     3 0.99830       1         TRUE
    

    【讨论】:

    • 嗯,这是很多额外的东西,我会做x[, maxindicator := 1*(value == max(value)), by = group]
    • +1,我想如果条件仅限于[&lt;this part&gt;,] 或需要在.SD 内进行评估。
    【解决方案3】:

    这是plyr 的解决方案:

    x$largest <- 0
    x <- ddply(x, .(group), function(df) {
        df$largest[which.max(df$value)] <- 1
        df
    })
    

    还有一个以 R 为基数的:

    x$largest <- 0
    l <- split(x, x$group)
    l <- lapply(l, function(df) {
        df$largest[which.max(df$value)] <- 1
        df
    })
    x <- do.call(rbind, l)
    

    【讨论】:

      【解决方案4】:

      这是一个不太酷的基本方法:

      FUN <- function(x) {y <- rep(0, length(x)); y[which.max(x)] <- 1; y}
      x$largest <- unlist(tapply(x$value, x$group, FUN))
      
      ##    group   value largest
      ## 1      1 0.02827       0
      ## 2      1 0.02703       0
      ## 3      1 0.02874       1
      ## 4      2 0.03255       0
      ## 5      2 0.10394       1
      ## 6      2 0.03417       0
      ## 7      3 0.13858       0
      ## 8      3 0.16084       0
      ## 9      3 0.99830       1
      ## 10     3 0.24563       0
      

      在基地做起来比我预想的要困难。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 2021-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-22
        相关资源
        最近更新 更多