鉴于以下数据:
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的聚合minsetNames(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中最简单的方法是什么?
答案 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