如何按另一DataFrame行顺序重排不同维度的DataFrame
解决方案:按指定DataFrame的国家顺序重排DF1
首先检查你之前代码的问题:你写的是DF1$country,但实际DF1的列名是Country(大小写不一致),这会导致match返回NA,排序失效,修正列名即可解决问题。
Base R 实现
基础排序(保留所有行,DF2中不存在的国家排在最后)
DF1_sorted <- DF1[order(match(DF1$Country, DF2$Country)), ]
仅保留DF2中存在的国家并排序
如果不需要DF2里没有的国家,可以先过滤再排序:
# 过滤出DF2中存在的国家 DF1_filtered <- DF1[DF1$Country %in% DF2$Country, ] # 按DF2的国家顺序排序 DF1_sorted <- DF1_filtered[order(match(DF1_filtered$Country, DF2$Country)), ]
dplyr 实现
利用因子(factor)的水平(levels)来指定排序顺序,这是dplyr中更直观的方式:
基础排序
library(dplyr) DF1_sorted <- DF1 %>% # 将Country转换为因子,水平设置为DF2的Country顺序 mutate(Country = factor(Country, levels = DF2$Country)) %>% # 按因子水平排序 arrange(Country)
过滤并排序
如果只保留DF2中存在的国家:
DF1_sorted <- DF1 %>% mutate(Country = factor(Country, levels = DF2$Country)) %>% # 过滤掉DF2中不存在的国家(对应因子为NA的行) filter(!is.na(Country)) %>% arrange(Country)
额外:同时按Score降序排序
如果需要在国家顺序基础上,每个国家内按Score降序排列,只需在arrange中添加desc(Score):
DF1_sorted <- DF1 %>% mutate(Country = factor(Country, levels = DF2$Country)) %>% filter(!is.na(Country)) %>% arrange(Country, desc(Score))
内容的提问来源于stack exchange,提问作者coffee_loving_narwhal
相关产品推荐
相关产品推荐

