【发布时间】:2019-08-31 09:36:41
【问题描述】:
我有一个循环,在不同的迭代中,我想使用不同的列列表对数据框进行排序。当我对排序变量进行硬编码时,我可以进行这种排序。但是我想使用变量列表传递列名。我找不到这样做的方法。
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、50stater、geofacet),因此除非我卸载这些包,否则“地图”功能无法按建议工作。是否有资格使用本机“地图”功能而不是地理空间地图功能?
感谢您的帮助!
【问题讨论】:
-
您提供的示例代码不是有效的 R 代码。例如
sorting <-(sort1,sort2)会抛出一个错误。for (i = 1:2)同上。这可能表明通用 R 语法存在更深层次的问题。也许您需要退后一步,先熟悉 R 的基础知识;你可以在网上找到很多免费的材料。一个好的起点可能是An introduction to R。 -
谢谢。我更正了帖子中的语法。
-
谢谢。也更正了。这是 5000 行代码的简化版本。抱歉打错了。
-
“是否有资格使用原生“地图”功能而不是地理空间地图功能?”只需在前缀
purrr::map。
标签: r sorting dataframe vector