#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