【问题标题】:Creating unique count variable for each row based on group_by variable根据 group_by 变量为每一行创建唯一的计数变量
【发布时间】:2015-07-03 21:30:14
【问题描述】:

我有以下数据框:

help <- data.frame(id = c(5,5,5,5,5,12,12,12,17,17,20,20,20,20,20,20),
                   number = c(1,2,3,4,5,1,2,3,1,2,1,2,3,4,5,6),
                   episode = c(1,1,1,2,2,1,1,1,1,1,1,1,1,2,2,3))


   id number episode
1   5      1       1
2   5      2       1
3   5      3       1
4   5      4       2
5   5      5       2
6  12      1       1
7  12      2       1
8  12      3       1
9  17      1       1
10 17      2       1
11 20      1       1
12 20      2       1
13 20      3       1
14 20      4       2
15 20      5       2
16 20      6       3

对于每个 id,我有许多观察变量 number,但也希望在每一集中都有一个唯一的计数。

我希望 df 看起来像

   id number episode number.ep
1   5      1       1         1
2   5      2       1         2
3   5      3       1         3
4   5      4       2         1
5   5      5       2         2
6  12      1       1         1
7  12      2       1         2
8  12      3       1         3
9  17      1       1         1
10 17      2       1         2
11 20      1       1         1
12 20      2       1         2
13 20      3       1         3
14 20      4       2         1
15 20      5       2         2
16 20      6       3         1

在使用 group_by(id) 后,我在 mutate 命令中遇到了错误。有什么建议么?

【问题讨论】:

  • 你运行了什么代码?你到底得到了什么错误?
  • 我试过group_by(id) %&gt;% mutate(number.ep = count(n))),其中许多不同变体的错误是Error: no applicable method for 'group_by_' applied to an object of class "c('integer', 'numer')"
  • 有趣,这种操作的具体用例是什么?我看到一个新的剧集号如何触发索引的重新启动,或者你称之为计数变量。这个逻辑到底解决了什么应用?
  • 我试图通过 id 和剧集编号来分组...但得到了同样的错误。不确定这是否能回答您的问题。

标签: r dplyr


【解决方案1】:

使用 dplyr:

library(dplyr)

help %>% group_by(id, episode) %>%
         mutate(number.ep = row_number( ))

【讨论】:

    【解决方案2】:

    这可能是一种选择

    library(dplyr)
    help %>% group_by(id, episode) %>% 
             mutate(number.ep = seq(1, length(episode), by = 1))
    
    #   id number episode number.ep
    #1   5      1       1         1
    #2   5      2       1         2
    #3   5      3       1         3
    #4   5      4       2         1
    #5   5      5       2         2
    #6  12      1       1         1
    #7  12      2       1         2
    #8  12      3       1         3
    #9  17      1       1         1
    #10 17      2       1         2
    #11 20      1       1         1
    #12 20      2       1         2
    #13 20      3       1         3
    #14 20      4       2         1
    #15 20      5       2         2
    #16 20      6       3         1
    

    使用data.table 相当于

    library(data.table)
    setDT(help)[, number.ep := seq(.N), by = .(id, episode)]
    
    #> help
    #    id number episode number.ep
    # 1:  5      1       1         1
    # 2:  5      2       1         2
    # 3:  5      3       1         3
    # 4:  5      4       2         1
    # 5:  5      5       2         2
    # 6: 12      1       1         1
    # 7: 12      2       1         2
    # 8: 12      3       1         3
    # 9: 17      1       1         1
    #10: 17      2       1         2
    #11: 20      1       1         1
    #12: 20      2       1         2
    #13: 20      3       1         3
    #14: 20      4       2         1
    #15: 20      5       2         2
    #16: 20      6       3         1
    

    【讨论】:

    • 你的seq而不是seq(.N)/seq(n())有什么原因吗?
    猜你喜欢
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2019-07-31
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多