Выявление пропущенных наблюдений в группах - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть некоторые трудности с моим кодом, и я надеюсь, что некоторые из вас могли бы помочь.

Набор данных выглядит примерно так:

df <- data.frame("group" = c("A", "A", "A","A_1", "A_1", "B","B","B_1"), 
                 "id" = c("id1", "id2", "id3", "id2", "id3", "id5","id1","id1"), 
                 "time" = c(1,1,1,3,3,2,2,5),
                 "Val" = c(10,10,10,10,10,12,12,12))

"группа" указывает группу, к которой принадлежит человек«id» находится в. «A_1» означает, что субъект покинул группу.

Например, один субъект «id1» покидает «группу A», которая становится группой «A_1», где только «id2»и "id3" являются членами.Точно так же «id5» покидает группу B, которая становится «B_1» с только id1 в качестве члена.

То, что я хотел бы иметь в окончательном наборе данных, - это идентификация групп противоположного типа, которая должна выглядеть примерно так:

final <- data.frame("group" = c("A", "A", "A","A_1", "B","B","B_1"), 
                     "id" = c("id1", "id2", "id3", "id1", "id5","id1","id5"), 
                     "time" = c(1,1,1,3,2,2,5),
                     "Val" = c(10,10,10,10,12,12,12),
                     "groupid" = c("A", "A", "A","A", "B","B","B"))

, причем «A_1» и «B_1» указывают только субъектов, «id1» и «id5», соответственно, которые покинули исходную группу, вместо идентификации оставшихся объектов.

У кого-нибудь есть предложения о том, как я мог бы систематически это делать?

Заранее благодарю за помощь.


Продолжение:

Мои данные немного сложнее, чем в приведенном выше примере, так как их несколько "выходы "из обработок, более того, идентификатор группы может иметь разные символьные длины (здесь, например, AAA и B).Данные больше похожи на следующие:

df2 <- data.frame("group" = c("AAA", "AAA", "AAA","AAA","AAA_1","AAA_1", "AAA_1","AAA_2","AAA_2","B","B","B_1"), 
                  "id" = c("id1", "id2", "id3","id4", "id2", "id3","id4", "id2","id3", "id5","id1","id1"), 
                  "time" = c(1,1,1,1,3,3,3,6,6,2,2,5),
                  "Val" = c(10,10,10,10,10,10,10,10,10,12,12,12))

Где в момент времени 3 id1 покидает группы AAA, которые становятся группами AAA_1, в то время как в момент времени 6, также id4 покидает группу AAA, которая становится группой AAA_2.Как обсуждалось ранее, я хотел бы, чтобы группы с "_" идентифицировали те идентификаторы, которые покинули группу, а не оставшиеся.Следовательно, окончательный набор данных должен выглядеть примерно так:

final2 <- data.frame("group" = c("A", "A", "A","A","A_1","A_2",                     
                              "B","B","B_1"), 
                  "id" = c("id1", "id2", "id3","id4", "id1", "id4", "id5","id1","id5"), 
                  "time" = c(1,1,1,1,3,6,2,2,5),
                  "Val" = c(10,10,10,10,10,10,12,12,12))

спасибо за помощь мне с этим

1 Ответ

2 голосов
/ 27 сентября 2019

Хорошо, вы можете попробовать с dplyr следующим образом: возможно, это не элегантно, но вы получите результат.Идея состоит в том, чтобы сначала выбрать те, которые находятся в group ..., но не в относительном ..._1 и изменить их group, выбрать другие и rbind их вместе:

library(dplyr)
# first you could find the one that are missing in the ..._1 groups
# and change their group to ..._1
    dups <-
           df %>%
           group_by(id, groupid = substr(group,1,1)) %>%
           filter(n() == 1)%>%
           mutate(group = paste0(group,'_1')) %>%
           left_join(df %>%
                     select(group, time, Val) %>%
                     distinct(), by ='group') %>% 
           select(group, id, time = time.y, Val = Val.y) %>%
           ungroup()

dups
# A tibble: 2 x 5
  groupid group id     time   Val
  <chr>   <chr> <fct> <dbl> <dbl>
1 A       A_1   id1       3    10
2 B       B_1   id5       5    12

# now you can select the ones that are in both groups:
dups2 <-
        df %>%
        filter(nchar(as.character(group)) == 1) %>%
        mutate(groupid = substr(group,1,1))

   dups2
  group  id time Val groupid
1     A id1    1  10       A
2     A id2    1  10       A
3     A id3    1  10       A
4     B id5    2  12       B
5     B id1    2  12       B

Последнее, rbind() их, arrange() их и order() столбцов:

rbind(dups, dups2) %>%
 arrange(group) %>%
 select(group, id, time, Val, groupid)

# A tibble: 7 x 5
  group id     time   Val groupid
  <chr> <fct> <dbl> <dbl> <chr>  
1 A     id1       1    10 A      
2 A     id2       1    10 A      
3 A     id3       1    10 A      
4 A_1   id1       3    10 A      
5 B     id5       2    12 B      
6 B     id1       2    12 B      
7 B_1   id5       5    12 B 

Надеюсь, это поможет!

...