r - 通过列名列表按多列对数据框进行排序
问题描述
我有一个循环,在不同的迭代中,我想使用不同的列列表对数据框进行排序。当我对排序变量进行硬编码时,我可以进行这种排序。但是我想使用变量列表传递列名。我找不到这样做的方法。
DT <-data.frame(avar = c(1,4,3,1), bvar = c("a","f","s","b"), cvar = c(3,4,5,2))
sort1 <-c("avar", "cvar")
sort2 <-c("avar", "bvar")
sorting <-list(sort1,sort2)
DT2<-list()
for (i in 1:2) {
sorter<- sorting[[i]]
#THE FOLLOWING SOLUTION WORKS!!!
DT2[[i]] <- DT[do.call(order,DT[as.character(sorting[[i]])]),]
}
我所说的按 c("avar", "cvar") 排序的意思是数据首先按 avar 排序,然后(如果有两个相同的 avar 值)然后按 cvar。换句话说,按该向量排序的输出应该只是一个排序的数据帧(而不是列表)。按 c("avar", "bvar") 排序也是一样。上面的“ps1”代表建议的解决方案之一。它给了我 DT2[[1]] 这是两个数据帧的列表。那不是我需要的。DT2 应该是两个数据帧的列表。DT2[[1]] 应该是一个数据帧。
我还想强调,我确实需要通过循环进行这种排序,而不是通过将列表(“排序”)传递给命令。换句话说,第一次迭代应该按排序列表的第一项对数据库进行排序,这是我代码中的向量“排序器”。在实际应用中,不同迭代的数据并不是同一个数据集。
在第一个循环之后,DT2[[1]] 应该排序如下:
avar bvar cvar
1 b 2
1 a 3
3 s 5
4 f 4
在第二个循环之后 DT2[[2]] 应排序为:
avar bvar cvar
1 a 3
1 b 2
3 s 5
4 f 4
在现实生活中,我可能在不同的迭代中也有不同数量的排序列。
关于建议使用“地图”功能的解决方案:我加载了一些地理空间包(mapproj、五十州、geofacet),因此除非我卸载这些包,否则“地图”功能无法按建议工作。有没有办法有资格使用本机“地图”功能而不是地理空间地图功能?
谢谢您的帮助!
解决方案
使用基础 R,我们可以在using中应用于order
选定的列。我们用来获取数据框列表sorting
do.call
lapply
lapply(sorting, function(x) DT[do.call(order, DT[x]), ])
#[[1]]
# avar bvar cvar
#4 1 b 2
#1 1 a 3
#3 3 s 5
#2 4 f 4
#[[2]]
# avar bvar cvar
#1 1 a 3
#4 1 b 2
#3 3 s 5
#2 4 f 4
推荐阅读
- java - Project Reactor:用 Mono 的结果丰富 Flux 的结果
- python - 在python中使用变量查询或过滤数据集
- html - 每行显示 5 个 div,所有行开始和结束都在同一个地方
- angular - CombineLatest 无限循环采摘算子
- python - 使用给定 json 的 for/loop 渲染模板
- selenium-chromedriver - 带有用于 opentest 的 selenium 代码的地理定位器
- javascript - eslint 看不到绑定上下文
- c - What's the best approach to execute two programs at the same time in C?
- sql - 在表 USERS 中插入 1000 封电子邮件
- mysql - 如何根据 MySQL 中的条件创建新列并向其添加值?