对于 R data.table,如何使用 uniqueN() 对多列中的 unique/distinct 值进行排序?
For R data.table, how to use uniqueN() in order count unique/distinct values in multiple columns?
假设我们有以下 R data.table
(尽管原则上 dataframe
也可以):
library(data.table)
new_dt = as.data.table(readcsv(...))
head(new_dt)
name order_no overlimit
1 Amy 32 TRUE
2 Jack 14 TRUE
3 Jack 16 TRUE
4 Dave 11 FALSE
5 Amy 22 TRUE
6 Jack 16 TRUE
7 Tom 19 FALSE
8 Larry 22 FALSE
9 Tom 89 FALSE
10 Dave 81 TRUE
11 Jack 67 TRUE
12 Tom 60 TRUE
13 Amy 23 FALSE
14 Jack 16 TRUE
对于此任务,order_no
的值无关紧要---我想计算 name
和 overlimit
的唯一行数:
name overlimit distinct_groups
Amy TRUE 2
Amy FALSE 1
Jack TRUE 4
Jack FALSE 0
Dave TRUE 1
Dave FALSE 1
...
是否只是在 by
参数中包含更多列?
如果要求将'overlimit'中的相邻元素作为一个单独的组,那么我们可以使用rleid
创建组
dt[, .(overlimit = overlimit[1], distinct_group = uniqueN(order_no)),
.(name, grp = rleid(overlimit))][, grp := NULL][]
如果是简单的分组,只需要组合
dt[, .(distinct_group = .N), by = .(name, overlimit)
][CJ(name = dt$name, overlimit = dt$overlimit, unique = TRUE),
on = .(name, overlimit)][is.na(distinct_group), distinct_group := 0][]
要回答您的问题,是的,您可以将两列都添加到 by
参数中:
dt[, .(distinct_groups = uniqueN(order_no)), by = c("Name", "Overlimit")]
假设我们有以下 R data.table
(尽管原则上 dataframe
也可以):
library(data.table)
new_dt = as.data.table(readcsv(...))
head(new_dt)
name order_no overlimit
1 Amy 32 TRUE
2 Jack 14 TRUE
3 Jack 16 TRUE
4 Dave 11 FALSE
5 Amy 22 TRUE
6 Jack 16 TRUE
7 Tom 19 FALSE
8 Larry 22 FALSE
9 Tom 89 FALSE
10 Dave 81 TRUE
11 Jack 67 TRUE
12 Tom 60 TRUE
13 Amy 23 FALSE
14 Jack 16 TRUE
对于此任务,order_no
的值无关紧要---我想计算 name
和 overlimit
的唯一行数:
name overlimit distinct_groups
Amy TRUE 2
Amy FALSE 1
Jack TRUE 4
Jack FALSE 0
Dave TRUE 1
Dave FALSE 1
...
是否只是在 by
参数中包含更多列?
如果要求将'overlimit'中的相邻元素作为一个单独的组,那么我们可以使用rleid
创建组
dt[, .(overlimit = overlimit[1], distinct_group = uniqueN(order_no)),
.(name, grp = rleid(overlimit))][, grp := NULL][]
如果是简单的分组,只需要组合
dt[, .(distinct_group = .N), by = .(name, overlimit)
][CJ(name = dt$name, overlimit = dt$overlimit, unique = TRUE),
on = .(name, overlimit)][is.na(distinct_group), distinct_group := 0][]
要回答您的问题,是的,您可以将两列都添加到 by
参数中:
dt[, .(distinct_groups = uniqueN(order_no)), by = c("Name", "Overlimit")]