如何计算聚合并将结果附加为R中的新列

时间:2014-10-14 07:45:41

标签: r

鉴于以下数据:

data
  a b c
1 x m 1
2 x n 2
3 x m 3
4 y n 4
5 y m 5
6 y n 6

我想计算由a,b:

分组的c的聚合min
setNames(aggregate(data$c, by=list(data$a, data$b), min), c("a", "b", "min_c"))

  a b min_c
1 x m     1
2 y m     5
3 x n     2
4 y n     4

但是,我想追加" min_c"原始数据,如下所示:

  a b c min_c
1 x m 1 1
2 x n 2 2
3 x m 3 1
4 y n 4 4
5 y m 5 5
6 y n 6 4

在R中最简单的方法是什么?

6 个答案:

答案 0 :(得分:4)

使用dplyr的方法是:

library(dplyr)

mydf %>%
    group_by(a,b) %>%
    mutate(cmin = min(c))

#  a b c cmin
#1 x m 1    1
#2 x n 2    2
#3 x m 3    1
#4 y n 4    4
#5 y m 5    5
#6 y n 6    4

答案 1 :(得分:3)

data.table方法

数据

library(data.table)
dt = data.table(a = rep(c("x", "y"), each=3),
                b = rep(c("m","n"), 3),
                c = 1:6)

计算并追加

dt[, cmin := min(c), by = "a,b"][]
#    a b c cmin
# 1: x m 1    1
# 2: x n 2    2
# 3: x m 3    1
# 4: y n 4    4
# 5: y m 5    5
# 6: y n 6    4

:=表示分配, []将打印结果

如果原始数据是数据框,如下所示:

df = data.frame(a = rep(c("x", "y"), each=3),
                b = rep(c("m","n"), 3),
                c = 1:6)

您可以使用setDT将其转换为数据表。

setDT(df)

答案 2 :(得分:2)

> zz <- " a b c
+ 1 x m 1
+ 2 x n 2
+ 3 x m 3
+ 4 y n 4
+ 5 y m 5
+ 6 y n 6"
> 
> Data <- read.table(text=zz, header = TRUE)
> dt <- as.data.table(Data)
> 
> dt[, min_c := min(c), by = list(a,b)]
> dt
   a b c min_c
1: x m 1     1
2: x n 2     2
3: x m 3     1
4: y n 4     4
5: y m 5     5
6: y n 6     4 

答案 3 :(得分:2)

基础R方法

transform(data, minc = ave(c, list(a, b), FUN = min))
#   a b c minc
# 1 x m 1    1
# 2 x n 2    2
# 3 x m 3    1
# 4 y n 4    4
# 5 y m 5    5
# 6 y n 6    4

答案 4 :(得分:1)

ddply(Data, .(a, b), transform, 
+       min_c=min(c))
  a b c min_c
1 x m 1     1
2 x m 3     1
3 x n 2     2
4 y m 5     5
5 y n 4     4
6 y n 6     4

答案 5 :(得分:0)

请尝试以下操作:

merge(data,data2)

完整输出:

> data
  a b c
1 x m 1
2 x n 2
3 x m 3
4 y n 4
5 y m 5
6 y n 6
> 
> data2 = setNames(aggregate(data$c, by=list(data$a, data$b), min), c("a", "b", "min_c"))
> data2
  a b min_c
1 x m     1
2 y m     5
3 x n     2
4 y n     4
> 
> merge(data,data2)
  a b c min_c
1 x m 1     1
2 x m 3     1
3 x n 2     2
4 y m 5     5
5 y n 4     4
6 y n 6     4