Подсчет появления переменной без учета дубликатов

У меня есть большой массив данных, называемый данными с 1 004 490 наблюдениями, и я хочу проанализировать успех лечения.

ID             POSITIONS             TREATMENT
1              0                     A
1              1                     A
1              2                     B
2              0                     C
2              1                     D
3              0                     B
3              1                     B
3              2                     C
3              3                     A
3              4                     A
3              5                     B

Итак, во-первых, я хочу подсчитать, сколько раз одно лечение применялось к пациенту (ID), но одно лечение может быть назначено iD несколько раз. Итак, мне нужно сначала удалить все дубликаты и после подсчета или есть функция, которая не учитывает все дубликаты.

What I want to have :  
A : 2
B : 2
C : 2
D : 1

Затем я хочу знать, сколько раз лечение проводилось в последней позиции, но последняя позиция всегда отличается в зависимости от идентификатора.

What I want to have :  
A : 0
B : 2 (for ID = 1 and 3)
C : 0
D : 1 (for ID = 1)

Спасибо за вашу помощь, я новый пользователь R!


person Anna Carrere    schedule 07.08.2017    source источник
comment
Попробуйте colSums(table(unique(df1[-2])))   -  person akrun    schedule 07.08.2017


Ответы (2)


Используя базу R, мы можем сделать,

merge(aggregate(ID ~ TREATMENT, df, FUN = function(i) length(unique(i))), 
      aggregate(ID ~ TREATMENT, df[!duplicated(df$ID, fromLast = TRUE),], toString), 
      by = 'TREATMENT', all = TRUE)

Который дает,

  TREATMENT ID.x ID.y
1         A    2 <NA>
2         B    2 1, 3
3         C    2 <NA>
4         D    1    2
person Sotos    schedule 07.08.2017
comment
Спасибо вам большое, это работает! Есть идеи по второму вопросу? :) - person Anna Carrere; 07.08.2017
comment
Оба вопроса решаются. Ты имеешь в виду, что тебе нужен счет? (0, 2, 0, 1)? - person Sotos; 07.08.2017

Вот подход tidyverse, при котором мы получаем distinct строк на основе «ID», «ЛЕЧЕНИЕ» и получаем count «ЛЕЧЕНИЕ».

library(tidyverse)
df1 %>%
    distinct(ID, TREATMENT) %>%
    count(TREATMENT)
# A tibble: 4 x 2
# TREATMENT     n
#      <chr> <int>
#1         A     2
#2         B     2
#3         C     2
#4         D     1

и для второго вывода, после группировки по «ID», slice последняя строка (n()), создайте столбец «ind» и fill с 0 для всех отсутствующих комбинаций «ЛЕЧЕНИЕ» с complete, затем получите sum из «ind» после группировки по 'ЛЕЧЕНИЕ'

df1 %>% 
   group_by(ID) %>% 
   slice(n()) %>%
   mutate(ind = 1) %>% 
   complete(TREATMENT = unique(df1$TREATMENT), fill = list(ind=0)) %>% 
   group_by(TREATMENT) %>%
   summarise(n = sum(ind))
# A tibble: 4 x 2
#  TREATMENT     n
#      <chr> <dbl>
#1         A     0
#2         B     2
#3         C     0
#4         D     1

данные

df1 <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 
3L), POSITIONS = c(0L, 1L, 2L, 0L, 1L, 0L, 1L, 2L, 3L, 4L, 5L
 ), TREATMENT = c("A", "A", "B", "C", "D", "B", "B", "C", "A", 
 "A", "B")), .Names = c("ID", "POSITIONS", "TREATMENT"),
 class = "data.frame", row.names = c(NA, -11L))
person akrun    schedule 07.08.2017
comment
Не получается, извините... А по петле можно или нет? - person Anna Carrere; 07.08.2017
comment
@AnnaCarrere Судя по приведенному вами примеру, у меня это работает. - person akrun; 07.08.2017