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
(使用 :=
)。默认情况下,所有其余行将分配 NA
s。
我需要获取通过 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
(使用 :=
)。默认情况下,所有其余行将分配 NA
s。