Как группировать и разгруппировать в R? - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть фрейм данных, как показано ниже

test_df <- data.frame("SN" = c("ABC123","ABC123","ABC123","MNO098","MNO098","MNO098"), 
                      "code" = c("ABC1111","DEF222","GHI133","","MNO1123","MNO567"), 
                      "d_time" = c("2220-08-27","2220-05-27","2220-02-27","2220-11-27","2220-02-27",""))

enter image description here

Я пытаюсь сделать 2 вещи

1)создать 2 новых столбца (p_id, v_id), убрав алфавиты из столбцов SN и code и сохранив только 9 цифр

2) создать столбец отставания (p_vid) на основе v_id для каждого человека, отсортированного по его / ее d_time

t_df <- test_df %>% group_by(SN)
t_df %>% arrange((d_time), .by_group = TRUE) ->> sorted_df #sorted based on d_time
transform_ids = function(DF){  # this function is to create person and visit_occurrence ids
  DF %>% 
    mutate(p_id = as.integer(str_remove_all(.$SN,"[a-z]|[A-Z]") %>%   #retaining only the numeric part
                                    str_sub(1,9))) %>%
    mutate(v_id = as.integer(str_remove_all(.$code,"[a-z]|[A-Z]") %>% 
                                              str_sub(1,9))) %>%
    group_by(p_id) %>%
    mutate(pre_vid = lag(v_id)) %>%
    ungroup
}
transform_ids(sorted_df)

Но при этом я сталкиваюсь с приведенной ниже ошибкой

Ошибка в представлении: столбец p_idдолжна иметь длину 3 (размер группы) или единицу, а не 6 Ошибка: столбец p_id должен иметь длину 3 (размер группы) или единицу, а не 6 Кроме того: предупреждающее сообщение: на виду (transform_ids (t_df)): показатьПовторный запуск трассировки с ошибкой отладки: столбец p_id должен иметь длину 3 (размер группы) или единицу, а не 6

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

enter image description here

1 Ответ

1 голос
/ 01 ноября 2019

Чтобы сгенерировать столбцы p_id и v_id, просто используйте sub:

t_df$p_id <- gsub("[A-Z]+", "", t_df$SN)
t_df$v_id <- gsub("[A-Z]+", "", t_df$code)

Для столбца p_vid используйте lag() из пакета dplyr:

t_df %>%
group_by(p_id) %>%
mutate(p_vid = lag(v_id, order_by=d_time, default=0))

Вывод из вышесказанного фактически дает вам толчок. Если вам нужен фрейм данных, просто используйте:

t_df <- as.data.frame(t_df)

Вывод:

  SN     code    d_time     p_id  v_id  p_vid
  <fct>  <fct>   <fct>      <chr> <chr> <chr>
1 ABC123 ABC1111 2220-08-27 123   1111  222  
2 ABC123 DEF222  2220-05-27 123   222   133  
3 ABC123 GHI133  2220-02-27 123   133   0    
4 MNO098 ""      2220-11-27 098   ""    1123 
5 MNO098 MNO1123 2220-02-27 098   1123  567  
6 MNO098 MNO567  ""         098   567   0    
...