我需要获取在id上分组的显式行的行号。我们说dataframe(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]))
请建议一些更好的方法来做到这一点。
答案 0 :(得分:7)
我建议使用data.table
软件包,以便在子集上运行时具有良好的功能,从而避免低效率的操作,例如ifelse
或评估整个数据集。此外,最好将矢量保持在数字类中(以便将来的操作),因此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
)的序列 (使用:=
)。默认情况下,所有其余行都将分配NA
个。