计算变量的出现而不考虑重复

时间:2017-08-07 09:50:10

标签: r count duplicates conditional find-occurrences

我有一个大数据框,称为1 004 490 obs的数据,我想分析治疗的成功。

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

然后,我想知道在最后一个位置给出了多少次治疗,但最后一个位置总是根据ID而不同。

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

感谢您的帮助,我是R的新用户

2 个答案:

答案 0 :(得分:1)

使用基数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

答案 1 :(得分:0)

这是一种tidyverse方法,我们根据'ID','TREATMENT'得到distinct行并获得'{1}}'治疗'

count

对于第二个输出,在按“ID”分组后,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 最后一行(slice),创建一个列'ind'和n(),其中0表示所有缺失的组合使用fill进行'TREATMENT',然后在'TREATMENT'分组后得到'ind'的complete

sum

数据

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