Подсчитайте количество элементов в группе без суммирования

#r #data.table #counting #resampling #summarize

Вопрос:

У меня есть набор данных, который выглядит так:

x <- data.table(id=c(1,1,1,2,2,3,4,4,4,4), cl=c("a","b","c","b","b","a","a","b","c","a"))

Я пытаюсь найти вероятность того, что строка будет выбрана для каждой группы (id) на основе элементов в cl.

Я попробовал следующее:

x[,num:=.N, keyby=.(id,cl)]

x[,den:=.N, keyby=.(id)]

x[,prob:=num/den, ]

Есть ли лучший способ сделать это?

В конечном счете, моей конечной целью было использовать значения вероятности в качестве весов при выборке строки для каждой группы (идентификатор). Любые лучшие альтернативы для достижения этих весов были бы весьма признательны.

Ответ №1:

Вы имели в виду что-то подобное?

 > x[, prob := prop.table(table(cl))[cl], id][]
    id cl      prob
 1:  1  a 0.3333333
 2:  1  b 0.3333333
 3:  1  c 0.3333333
 4:  2  b 1.0000000
 5:  2  b 1.0000000
 6:  3  a 1.0000000
 7:  4  a 0.5000000
 8:  4  b 0.2500000
 9:  4  c 0.2500000
10:  4  a 0.5000000
 

или

 > unique(x[, prob := prop.table(table(cl))[cl], id][])
   id cl      prob
1:  1  a 0.3333333
2:  1  b 0.3333333
3:  1  c 0.3333333
4:  2  b 1.0000000
5:  3  a 1.0000000
6:  4  a 0.5000000
7:  4  b 0.2500000
8:  4  c 0.2500000
 

Пояснение: table prop.table дает таблицу частот всех элементов, которые называются значениями, и, таким образом, мы используем [cl] для подмножества частот.

Комментарии:

1. Спасибо, это то, что я искал. Я не знал, как использовать эти функции. Было бы здорово, если бы вы добавили какое-нибудь описание

2. @K_D Да, я добавил несколько комментариев к своему коду.

Ответ №2:

Если ваша цель состоит в том, чтобы генерировать случайные выборки на основе наблюдаемых частот:

 x[, .N , by= .(id, cl)][, prop := N/sum(N), by = .(id)][]
#    id cl N      prop
# 1:  1  a 1 0.3333333
# 2:  1  b 1 0.3333333
# 3:  1  c 1 0.3333333
# 4:  2  b 2 1.0000000
# 5:  3  a 1 1.0000000
# 6:  4  a 2 0.5000000
# 7:  4  b 1 0.2500000
# 8:  4  c 1 0.2500000