【问题标题】:Add max value to a new column in R [duplicate]将最大值添加到R中的新列[重复]
【发布时间】:2016-06-07 15:48:19
【问题描述】:

这是数据:

a <- c(1,1,2,2,3)  
b <- c(1,3,5,9,4)
df1 <- data.frame(a,b)
df1

a b
1 1
1 3
2 5
2 9
3 4

我想要这样的东西:

a b max
1 1 3
1 3 3
2 5 9
2 9 9
3 4 4

我的问题:如何计算“a”列中“b”列中的值的“max”列分组?

我对聚合函数进行了一些研究,但仍然找不到解决方案。

请帮忙

【问题讨论】:

  • 对于您的结果,第 3 行,我认为您的意思是最大值应该是 5 而不是 9?

标签: r


【解决方案1】:

我们可以使用其中一个 group by 函数,它确实允许创建列,而不仅仅是 summarise 输出。 data.table 选项很简洁,因为分配 (:=) 将创建一个新列。我们将“data.frame”转换为“data.table”,按“a”分组,得到“b”的最大值(max(b))并分配(:=)作为新列。如果我们需要摘要,请使用 list 而不是 := 包装它。

library(data.table)
setDT(df1)[, Max:= max(b), a]

或使用来自base Rave。这是罕见的基本函数之一,它将输出与原始数据集的行数相同的长度。作为第一个参数,我们使用变量来获取max,第 2、第 3 等(如果有)将是分组列。指定FUN。默认情况下,如果我们不指定任何FUN,它将按组使用mean

df1$Max <- with(df1, ave(b, a, FUN=max)

dplyrdplyrdata.table 解决方案在获取 summary 或在原始数据集上获取新列的方式上很灵活。使用dplyr,在我们按“a”分组后,使用mutate 创建一个新列。相反,如果我们需要一个汇总版本,summarise 函数可以替换 mutate(其输出与aggregate 相似)。

library(dplyr)
df1 %>%
   group_by(a) %>%
   mutate(Max = max(b))
#      a     b   Max
#   (dbl) (dbl) (dbl)
#1     1     1     3
#2     1     3     3
#3     2     5     9
#4     2     9     9
#5     3     4     4

【讨论】:

    猜你喜欢
    • 2015-06-03
    • 2021-12-01
    • 2021-09-13
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    相关资源
    最近更新 更多