r прокрутка пользовательской функции по 2 столбцам

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

my_df <- data.frame("id"=c("151", "143", "199", "122", "156"), 
                "person"=c("mother", "father", "grandma", "child", "sister", "mother", "grandma", "grandma", "father", "mother","mother", "mother", "grandma", "child", "sister", "mother", "mother", "grandma", "father", "mother", "mother", "mother", "mother", "mother", "mother"))

my_new_df <- my_df %>%
group_by(id) %>% # first I subset by ID number
mutate(total = n()) # calculate the total number of observations per ID
filter(person=='mother') %>% # then I filter the observations I want to know about
mutate(n_mother = n()) %>% calculate the # of 'mother' observations per ID
mutate(prop_mother = rollapply(n_mother/total, width=1, FUN=(??)) # Here I get stuck - I want the proportion of 'mother' observations updated for every observation from this ID number
Do I write a custom function to call within the pipe?
calculate_mother = function(n_mother){
   return(n_mother / total)
}
After this, I want to calculate the rolling mean and variance of prop_mother as well, but I can't do that until I actually calculate prop_mother

person MeC    schedule 03.11.2020    source источник


Ответы (2)


Я бы попробовал что-то вроде этого:

#count is group_by and n rolled into one
all_ids <- my_df %>% count(id)

mom_ids <- my_df %>% filter(person=='mother') %>% count(id,name = "n_mother")

my_new_df <- full_join(all_ids,mom_ids)

my_new_df$n_mother[is.na(my_new_df$n_mother)] <- 0

my_new_df$prop_mother <- my_new_df$n_mother/my_new_df$n
person SirTain    schedule 03.11.2020

Вы ищете что-то подобное? Я не мог определить что-то для заказа, что было бы необходимо для скользящих вычислений, поскольку идентификатор дублируется для матери ... или вы можете группировать по идентификатору также не только человека

library(dplyr)

my_new_df <- my_df %>%
  dplyr::group_by(id) %>% 
  dplyr::mutate(total = n())  %>% 
  dplyr::mutate(n_mother = n()) %>%
  dplyr::group_by(person) %>%
  dplyr::mutate(prop_mother = n_mother/sum(total),
                roll_prop_mother = cumsum(prop_mother))
person DPH    schedule 03.11.2020
comment
Я не хотел дублировать удостоверение личности и мать - каждая запись в удостоверении личности имеет несколько «материнских» наблюдений. Исправлено это сейчас. - person MeC; 03.11.2020
comment
Это близко, но мне не нужна сумма пропорции, мне нужна обновленная пропорция от mother до total для каждой строки фрейма данных, сгруппированных по ID. - person MeC; 03.11.2020