【问题标题】:Assign increasing index per group in grouped dataframe in R在 R 中的分组数据框中为每组分配增加的索引
【发布时间】:2021-02-01 12:14:31
【问题描述】:

我有一个如下所示的数据框/小标题:

# A tibble: 15 x 2
# Groups:   id [3]
      id date      
   <int> <date>    
 1     1 1998-02-13
 2     1 1998-02-14
 3     1 1998-02-15
 4     1 1998-02-16
 5     1 1998-02-17
 6     2 1998-02-13
 7     2 1998-02-14
 8     2 1998-02-15
 9     2 1998-02-16
10     2 1998-02-17
11     3 1998-02-13
12     3 1998-02-14
13     3 1998-02-15
14     3 1998-02-16
15     3 1998-02-17

我想添加一个从 1:5 开始计数的变量“days_before_event”(但这不应该是硬编码的,而是每组的元素)。我虽然想做这样的事情

df_long %>% mutate(days_before_event = 1:nrow(.))

其中nrow(.) 应该是每组的行数。这不起作用并显示错误

Fehler: Problem with `mutate()` input `days_before_event`.
x Input `days_before_event` can't be recycled to size 5.
i Input `days_before_event` is `1:nrow(.)`.
i Input `days_before_event` must be size 5 or 1, not 15.
i The error occurred in group 1: id = 1.

关于我如何实现这一点的任何技巧?

【问题讨论】:

    标签: r dplyr group-by


    【解决方案1】:

    我们可以用row_number代替1:nrow

    library(dplyr)
    df_long %>% 
        mutate(days_before_event =row_number())
    

    或者使用base R,使用ave对'id'进行分组并得到序列(seq_along

    df_long$days_before_event <- with(df_long, ave(seq_along(id),
              id, FUN = seq_along))
    

    错误是因为它是一个分组数据集(来自打印数据中显示的组属性),因此,1:nrow将获取整个数据集的第1行到最后一行的序列,而不是最后一行团体。这会造成length 的不平衡,mutate 只能返回与原始数据具有相同length 的输出(否则必须包装在list 中)

    【讨论】:

    • 太棒了,非常感谢!!如果我想使用 base r,你知道我怎样才能达到同样的目标吗?
    • 哇,非常感谢! Base r 直接看起来更吓人哈哈
    • @RobinKohrs 在data.table中,更紧凑setDT(df_long)[, days_before_event := rowid(id)]
    • 非常感谢!我从未真正考虑过 data.table,因为我并没有真正使用大型数据集。我认为人们会放弃更简单的语法来加快处理速度。但也许值得更多研究:)
    猜你喜欢
    • 1970-01-01
    • 2013-07-03
    • 2021-06-15
    • 2021-08-28
    • 2020-11-20
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多