如何仅用mutate()和filter()按rate排序?为何Maryland排名4在Missouri前?
问题1:如何仅使用mutate()和filter()函数对数据集按rate字段进行排序?
mutate()和filter()本身不是专门的排序工具——mutate()负责添加/修改列,filter()负责筛选行,两者都不会改变数据集的行顺序。不过可以通过以下方式间接实现类似排序的效果:
- 先用
mutate()添加一个基于rate的排名列,比如按降序排名:data <- data %>% mutate(rank = rank(-rate)) - 若必须仅用
mutate()和filter(),可以生成排序索引列,再结合行号筛选:
不过这种方式本质依赖原数据集的行号映射,不如直接用# 按rate降序排序 sorted_data <- data %>% mutate(sort_idx = order(-rate)) %>% filter(row_number() %in% sort_idx)arrange()函数直观。
问题2:执行给定R代码后,排名为4的Maryland为何出现在排名为3的Missouri之前?
核心原因是:filter()函数只会筛选符合条件的行,但不会改变原数据集的行顺序。原数据集中Maryland的行本来就在Missouri的前面,所以即使rank列显示Maryland是第4、Missouri是第3,筛选后的结果还是保留了原数据的行顺序。
如果想要让结果按rank列排序,需要在filter()之后加上arrange(rank):
murders <- mutate(murders, rate = total/population*100000, rank = rank(-rate)) filter(murders, rank <= 5) %>% arrange(rank)
这样输出的结果就会按rank从1到5依次排列了。
内容的提问来源于stack exchange,提问作者mit_ran
相关产品推荐
相关产品推荐

