【问题标题】:Counting occurrence of a variable without taking account duplicates在不考虑重复的情况下计算变量的出现
【发布时间】:2018-01-14 14:09:46
【问题描述】:

我有一个大数据框,称为数据,包含 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的新用户!

【问题讨论】:

  • 试试colSums(table(unique(df1[-2])))

标签: r count duplicates conditional find-occurrences


【解决方案1】:

使用base 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

【讨论】:

  • 非常感谢,它有效!对第二个问题有任何想法吗? :)
  • 解决了这两个问题。你的意思是你想要计数? (0, 2, 0, 1)?
【解决方案2】:

这是一个tidyverse 方法,我们根据“ID”、“TREATMENT”获取distinct 行并获取“TREATMENT”的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,对于所有缺少的 'TREATMENT' 和 @ 组合,该列都为 0 987654328@,然后按'TREATMENT'分组后得到'ind'的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

数据

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))

【讨论】:

  • 它不起作用,对不起......但是通过循环它是否可能?
  • @AnnaCarrere 根据您展示的示例,它对我有用
猜你喜欢
  • 2015-02-28
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
相关资源
最近更新 更多