首页 > 解决方案 > 通过列名列表按多列对数据框进行排序

问题描述

我有一个循环,在不同的迭代中,我想使用不同的列列表对数据框进行排序。当我对排序变量进行硬编码时,我可以进行这种排序。但是我想使用变量列表传递列名。我找不到这样做的方法。

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),因此除非我卸载这些包,否则“地图”功能无法按建议工作。有没有办法有资格使用本机“地图”功能而不是地理空间地图功能?

谢谢您的帮助!

标签: rsortingdataframevector

解决方案


使用基础 R,我们可以在using中应用于order选定的列。我们用来获取数据框列表sortingdo.calllapply

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

推荐阅读