У меня небольшая проблема с согласованием логики этой проблемы с логикой dplyr
.Обычно, если вы хотите сократить группу до одного числа на группу, вы используете summarise
, а если вы хотите рассчитать отдельное число для каждой строки, вы используете mutate
.Но что, если вы хотите сделать расчет для группы для каждой строки?
В приведенном ниже примере mloc
содержит указатель на pnum
, и цель состоит в том, чтобы добавить новый столбец nm_child
который для каждой строки подсчитывает количество mloc
значений в группе, которые указывают (то есть имеют то же значение, что и) индекс строки в группе в pnum.Это было бы легко сделать с помощью вложенных циклов или с map
, если бы я знал, как выполнить итерации 1) для каждой группы, & 2) по каждому элементу, & 3) вернуть вывод карты в виде столбца в группе.
library(tidyverse)
ser <- c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2)
pnum <- c(1:5, 1:6)
mloc <- c(0, 2, 2, 0, 3, 1, 1, 0, 0, 3, 4)
tb1 <- tibble(ser,pnum, mloc)
tb2 <- tb1 %>%
group_by(ser) %>%
mutate(nm_child = sum(pnum == mloc))
Выше указано nm_child
всегда = 1. Я понимаю, почему это не работает, но я не понимаю, почему это так.
Я также пытался
mutate(nm_child = count(pnum == mloc))
(который возвращает
no applicable method for 'groups' applied to an object of class "logical")
и другие разные вещи. Я получил одну вещь для работы, добавив несколько столбцов для промежуточных значений и используя кучу вложенных ifelse (), новыполнение моих девяти миллионов строк занимает более 20 минут - в отличие, например, от регрессии и от самых простых операций dplyr, которые варьируются от нескольких секунд и слишком быстро заметны.
Желаемый результат:
tb2$nm_child = c(0, 2, 1, 0, 0, 2, 0, 1, 1, 0, 0)