r 中显式行的行号

row numbers for explicit rows in r

我需要获取通过 id 分组的显式行的行号。假设数据框 (df) 如下所示:

 id  a   b 
 3   2   NA
 3   3   2
 3   10  NA
 3   21  0
 3   2   NA
 4   1   5
 4   1   0
 4   5   NA

我需要再创建一个列来给出行号序列,不​​包括 b == 0.

的情况

期望的输出:

 id  a   b   row
 3   2   NA   1
 3   3   2    2
 3   10  NA   3
 3   21  0    -
 3   2   NA   4
 4   1   5    1
 4   1   0    -
 4   5   NA   2

我用了 dplyr 但没能达到同样的效果, 我的代码:

df <- df %>%
       group_by(id) %>%
       mutate(row = row_number(id[b != 0]))

请提出一些更好的方法。

我建议使用 data.table 包,因为它在子集上的操作能力很好,从而避免了低效操作,例如 ifelse 或评估整个数据集。此外,最好将向量保持在数字 class 中(以便将来操作),因此 NA 可能比 - (字符)更可取,这是一个可能的解决方案

library(data.table)
setDT(df)[is.na(b) | b != 0, row := seq_len(.N), by = id]
#    id  a  b row
# 1:  3  2 NA   1
# 2:  3  3  2   2
# 3:  3 10 NA   3
# 4:  3 21  0  NA
# 5:  3  2 NA   4
# 6:  4  1  5   1
# 7:  4  1  0  NA
# 8:  4  5 NA   2

这里的想法是仅对 is.na(b) | b != 0 所在的行进行操作,并生成每个组大小 (.N) 的序列,同时更新 row (使用 :=)。默认情况下,所有其余行将分配 NAs。