R语言row_number()生成序号全为1的问题:需按RDI降序分配患者唯一行号
为受试者分配唯一连续行号的问题解决
需求
生成按RDI从高到低排序,为每位患者分配唯一连续行号的表格。
样本数据集 RDItable
| SubjectID(受试者ID) | RDI | SomeOtherCols(其他列) |
|---|---|---|
| 1004 | 100 | x |
| 1004 | 100 | y |
| 1004 | 100 | z |
| 1002 | 99.5 | x |
| 1002 | 99.5 | y |
| 1002 | 99.5 | z |
| 1001 | 85.1 | x |
| 1001 | 85.1 | y |
| 1001 | 85.1 | z |
| 1003 | 100 | x |
| 1003 | 100 | y |
| 1003 | 100 | z |
尝试代码及问题
尝试代码:
attempt1 <- RDItable %>% distinct(SubjectID, RDI) %>% arrange(desc(RDI)) %>% mutate(row_id = row_number(RDI))
执行后得到的结果中row_id全部为1:
| SubjectID(受试者ID) | RDI | row_id |
|---|---|---|
| 1004 | 100 | 1 |
| 1003 | 100 | 1 |
| 1002 | 99.5 | 1 |
| 1001 | 85.1 | 1 |
预期结果
每行row_id为连续唯一值:
| SubjectID(受试者ID) | RDI | row_id |
|---|---|---|
| 1004 | 100 | 1 |
| 1003 | 100 | 2 |
| 1002 | 99.5 | 3 |
| 1001 | 85.1 | 4 |
解决方案
问题出在row_number(RDI)的用法:该函数会按RDI分组,计算每组内的行号,因此相同RDI的行都会得到1。要生成全局连续的行号,直接使用不带参数的row_number()即可,它会基于排序后的整个数据集生成连续编号。
修正后的代码:
fixed_code <- RDItable %>% distinct(SubjectID, RDI) %>% arrange(desc(RDI)) %>% mutate(row_id = row_number())
执行该代码后,就能得到符合预期的结果,每个受试者拥有唯一的连续行号。
内容的提问来源于stack exchange,提问作者Victoria Rees
相关产品推荐
相关产品推荐

