【问题标题】:In R, what's the average number of repeated column values per ID?在 R 中,每个 ID 的重复列值的平均数量是多少?
【发布时间】:2021-11-22 19:27:58
【问题描述】:

背景

我有这个 R 数据框,d

d <- data.frame(ID = c("a","a","a","a","a","a","b","b"),
                event = c("G12","G12","G12","B4","B4","A24","L5","L5"),
                stringsAsFactors=FALSE)

看起来像这样:

如您所见,其中有 2 个不同的 ID,每个都有 events,其中一些重复 / 重复任意次数。

问题

我想弄清楚这个数据帧中每个ID 的重复event 的平均数量是多少。

一目了然,您会看到id= a2 个重复的事件 - G12,重复两次(总共 3 个条目)和 B4,重复一次(总共有 2 个条目)。 id= b1 重复事件:L5。请注意,每次重复/重复发生多少次与我无关;重要的是每个ID 至少有一个重复的event

所以我想要的结果是该平均值的简单列表:

2 个重复事件 + 1 个重复事件)/2 人 = 1.5

我的尝试

感谢this 之类的帖子,我已经有点接近了,但我还不太了解:

d %>% summarise(mean = mean(duplicated(event)))

这会运行,但它没有考虑到重复发生在 ID 内的事实(或者至少,我是这么认为的)。

【问题讨论】:

    标签: r dplyr duplicates


    【解决方案1】:

    这是你想要的吗?

    d %>%
      group_by(event , ID) %>%
      dplyr::summarise(n = n()) %>%
      filter(n > 1) %>%
      group_by(ID) %>%
      dplyr::summarise(n = n()) %>%
      summarise(result = mean(n))
    
      result
    1    1.5
    

    d

      ID event
    1   Bill     1
    2   Bill     1
    3   Bill     2
    4   Bill     2
    5   Bill     3
    6   Bill     3
    7   Bill     4
    8   Bill     4
    9  Sarah     1
    10 Sarah     1
    11 Sarah     2
    12 Sarah     2
    13 Sarah     3
    14 Sarah     3
    15 Sarah     4
    16 Sarah     4
    17 Sarah     5
    18 Sarah     5
    19  Jane     1
    20  Jane     1
    
        result
    1 3.333333
    

    对代码的小检查

    d %>%
      group_by(event , ID) %>%
      dplyr::summarise(n = n()) %>%
      filter(n > 1) %>%
      group_by(ID) %>%
      dplyr::summarise(n = n())
    
      ID        n
      <chr> <int>
    1 Bill      4
    2 Jane      1
    3 Sarah     5
    

    【讨论】:

    • 不,不完全是。我需要一个数字来平均数据集中每人重复events 的计数。例如,假设 Bill 有 4 个重复的事件,Sarah 有 5 个重复的事件,Jane 有 1 个重复的事件。 (4+5+1) / 3 人 == 3.33
    • @logjammin 哦...那么在您的情况下,在 (2+1)/2 中,2 是 a 的重复事件的数量,1 是 b 的重复事件的数量。对吗?
    • 是的,没错!
    • @logjammin 我在上面编辑了我的代码。感谢您的友好解释。
    • 是的,看起来很棒,谢谢 Park。 (虽然你不需要在我的评论中包含 Bill / Sarah / Jane 部分,如果你不想要 - 那是一个单独的例子!?)
    【解决方案2】:

    对于每个ID,您可以计算出现不止一次的event,然后计算比率。

    library(dplyr)
    
    d %>%
      group_by(ID) %>%
      summarise(dup = sum(table(event) > 1)) %>%
      summarise(ratio = mean(dup))
    
    #  ratio
    #  <dbl>
    #1   1.5
    

    【讨论】:

    • 这真的很有帮助,谢谢。问题:如果我想按年份变量year 对它进行分组,这样每年都会有一个比率,而不是整个数据框的 1 个比率?如果太多了,别担心,我可以作为一个新问题发布。
    • 如果您将group_by(ID) 更改为group_by(year, ID) 我认为应该可以。
    【解决方案3】:

    我们可以在base R 轻松做到这一点

    mean(rowSums(table(d) > 1))
    [1] 1.5
    

    dplyr

    library(dplyr)
    d %>%
       count(event, ID) %>%
       summarise(ratio = mean(rowsum(+(n> 1), ID)))
      ratio
    1   1.5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 2018-08-27
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      相关资源
      最近更新 更多