У меня есть tbl_df, где я хочу group_by(u, v)
для каждой отдельной целочисленной комбинации, наблюдаемой с помощью (u, v)
.
EDIT: это было разрешено добавлением group_indices()
обратно в dplyr 0.4.0
a) Затем я хочу присвоить каждой отдельной группе некоторую произвольную отличную метку числа = 1,2,3...
например комбинация (u, v) == (2,3) может получить метку 1, (1,3) может получить 2 и т.д.
Как сделать это с помощью одного mutate()
, без трехступенчатого обобщения и самостоятельного присоединения?
dplyr имеет опрятную функцию n()
, но это дает количество элементов внутри ее группы, а не общее число группы. В data.table
это будет просто называться .GRP
.
b) На самом деле я действительно хочу назначить метку string/character ('A', 'B',...).
Но нумерация групп целыми числами достаточно хороша, потому что я могу использовать integer_to_label(i)
, как показано ниже. Разве есть умный способ объединить эти два? Но не потейте эту часть.
set.seed(1234)
# Helper fn for mapping integer 1..26 to character label
integer_to_label <- function(i) { substr("ABCDEFGHIJKLMNOPQRSTUVWXYZ",i,i) }
df <- tbl_df(data.frame(u=sample.int(3,10,replace=T), v=sample.int(4,10,replace=T)))
# Want to label/number each distinct group of unique (u,v) combinations
df %>% group_by(u,v) %>% mutate(label = n()) # WRONG: n() is number of element within its group, not overall number of group
u v
1 2 3
2 1 3
3 1 2
4 2 3
5 1 2
6 3 3
7 1 3
8 1 2
9 3 1
10 3 4
KLUDGE 1: could do df %>% group_by(u,v) %>% summarize(label = n()) , then self-join