【发布时间】:2022-01-24 04:41:20
【问题描述】:
我有一个数据集如下 -
library(data.table)
dt1 = data.table(A = c(rnorm(1:5, mean = 5, sd = 1), rnorm(1:5, mean = 7, sd = 1), rnorm(1:5, mean = -2, sd = 1)),
group= c(rep(0,5), rep(1,5), rep(2,5)))
> dt1
A group
1: 3.276487 0
2: 4.958663 0
3: 4.623734 0
4: 6.163073 0
5: 3.361670 0
6: 8.513315 1
7: 6.793443 1
8: 6.615550 1
9: 5.675353 1
10: 7.484761 1
11: -2.089462 2
12: -1.234090 2
13: -2.398878 2
14: -1.794349 2
15: -3.584671 2
我想添加一个名为 label 的新列,以便标签按第一列(dt1 中的 A 列)的组平均值的升序排列。这是预期的输出 -
> dt1
A group label
1: 3.276487 0 1
2: 4.958663 0 1
3: 4.623734 0 1
4: 6.163073 0 1
5: 3.361670 0 1
6: 8.513315 1 2
7: 6.793443 1 2
8: 6.615550 1 2
9: 5.675353 1 2
10: 7.484761 1 2
11: -2.089462 2 0
12: -1.234090 2 0
13: -2.398878 2 0
14: -1.794349 2 0
15: -3.584671 2 0
首选使用data.table 的单行解决方案。
这是所有data.table 解决方案的性能。我接受 Christian 的解决方案,因为它易于理解、使用 data.table 库(根据要求)和速度。
microbenchmark::microbenchmark(
rg255 = dt1 <- dt1[dt1[, mean(A), by=group], on="group"][order(V1), V1 := .GRP, by=group],
maydin = {x <- aggregate(dt1[,1],by=dt1[,2],mean)
merge(dt1,data.frame(group=x[,-2],label=3-order(-x[,2])),by="group")},
r2evans = dt1[, mu := mean(A), by = .(group)][, label := match(mu, sort(unique(mu))) - 1][, mu := NULL][],
ThomasIsCoding = dt1[
dt1[, .(label = mean(A)), group][
, label := rank(label) - 1
],
on = .(group)
],
Christian = dt1[, label := match(group, dt1[, mean(A), group][order(V1)]$group)-1],
Sotos = rep(rank(unique(with(dt1, ave(A, group)))), table(dt1$group)) - 1,
times = 100)
Unit: microseconds
expr min lq mean median uq max neval cld
rg255 3621.721 4855.061 5730.3802 5992.227 6522.7175 10119.238 100 c
maydin 4716.400 6775.483 7398.4339 7456.865 7817.8770 36566.490 100 d
r2evans 1921.305 2053.526 2510.4819 2160.812 2508.9465 29398.192 100 b
ThomasIsCoding 3252.965 5054.413 5399.1829 5615.391 6062.0480 8690.087 100 c
Christian 1825.354 1964.455 2158.2592 2045.222 2407.6425 3971.686 100 b
Sotos 607.254 705.982 755.2218 749.612 779.3045 1200.381 100 a
【问题讨论】:
标签: r data.table