Могу ли я перечислить уникальные значения для одного столбца при группировании по другому столбцу в R? - PullRequest
2 голосов
/ 06 марта 2020

У меня есть следующие столбцы:

 session  condition           codes    

      15 anxiety                 1       
      15 depression              1        
      15 bipolar                 1
      15 high blood pressure     3
      15 panic attacks           1
      66 hypertension            5
      66 high blood pressure     3
      66 anxiety                 1
      66 panic attacks           1
      75 schizophrenia           1
      32 muscular dystrophy      4
      32 anxiety                 1      
      32 depression              1
      32 panic attacks           1

Я хочу создать новый столбец, содержащий только уникальные коды для сеанса, а затем оставить остальные строки для этого сеанса пустыми. Я знаю, что это логически не имеет смысла, потому что этот третий столбец не совпадает с первым. Если это должно быть в новом объекте или списке или что-то, что хорошо.

 session  condition           codes     unique_codes

      15 anxiety                 1       1
      15 depression              1       3
      15 bipolar                 1
      15 high blood pressure     3
      15 panic attacks           1       
      66 hypertension            5       5
      66 high blood pressure     3       3
      66 anxiety                 1       1
      66 panic attacks           1
      75 schizophrenia           1       1
      32 muscular dystrophy      4       4
      32 anxiety                 1       1
      32 depression              1
      32 panic attacks           1

Я пытался:

conditions=conditions %>%
  group_by(session)%>%
  mutate(unique_codes=unique(conditions$codes))

Однако я получаю сообщение об ошибке «должно быть длина 5 (размер группы) или единица, а не 4», что, я полагаю, потому что я хочу, чтобы остальные строки были пустыми. Кто-нибудь знает способ обойти это? Спасибо !!

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Длина - это проблема, мы можем либо вставить ее вместе, либо создать столбец списка

library(dplyr)
conditions %>%
    group_by(session)%>% 
    mutate(unique_codes = toString(unique(codes)))

Или другой вариант - установить значение length, добавив NA в конце

conditions %>%
   group_by(session) %>%
   mutate(unique_codes = `length<-`(unique(codes), n()))
# A tibble: 14 x 4
# Groups:   session [4]
#   session condition           codes unique_codes
#     <int> <chr>               <int>        <int>
# 1      15 anxiety                 1            1
# 2      15 depression              1            3
# 3      15 bipolar                 1           NA
# 4      15 high blood pressure     3           NA
# 5      15 panic attacks           1           NA
# 6      66 hypertension            5            5
# 7      66 high blood pressure     3            3
# 8      66 anxiety                 1            1
# 9      66 panic attacks           1           NA
#10      75 schizophrenia           1            1
#11      32 muscular dystrophy      4            4
#12      32 anxiety                 1            1
#13      32 depression              1           NA
#14      32 panic attacks           1           NA

В OP упоминается, что n() не работает (может быть проблема с dplyr версией). В этом случае length должно работать

conditions %>%
   group_by(session) %>%
   mutate(unique_codes = `length<-`(unique(codes), length(codes)))

data

conditions <- structure(list(session = c(15L, 15L, 15L, 15L, 15L, 66L, 66L, 
66L, 66L, 75L, 32L, 32L, 32L, 32L), condition = c("anxiety", 
"depression", "bipolar", "high blood pressure", "panic attacks", 
"hypertension", "high blood pressure", "anxiety", "panic attacks", 
"schizophrenia", "muscular dystrophy", "anxiety", "depression", 
"panic attacks"), codes = c(1L, 1L, 1L, 3L, 1L, 5L, 3L, 1L, 1L, 
1L, 4L, 1L, 1L, 1L)), class = "data.frame", row.names = c(NA, 
-14L))
0 голосов
/ 06 марта 2020

Другой вариант dplyr может быть:

df %>%
 group_by(session) %>%
 distinct(codes) %>%
 transmute(unique_codes = codes,
           rowid = 1:n()) %>%
 right_join(df %>%
            group_by(session) %>%
            mutate(rowid = 1:n())) %>%
 ungroup() %>%
 select(-rowid)

   session unique_codes condition           codes
     <int>        <int> <chr>               <int>
 1      15            1 anxiety                 1
 2      15            3 depression              1
 3      15           NA bipolar                 1
 4      15           NA high blood pressure     3
 5      15           NA panic attacks           1
 6      66            5 hypertension            5
 7      66            3 high blood pressure     3
 8      66            1 anxiety                 1
 9      66           NA panic attacks           1
10      75            1 schizophrenia           1
11      32            4 muscular dystrophy      4
12      32            1 anxiety                 1
13      32           NA depression              1
14      32           NA panic attacks           1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...