有没有更简单的方法来按列的值重新排序数据

有没有更简单的方法来按列的值重新排序数据

我在 order 周围写了这个小小的包装器,但我担心我的实现是蹩脚的。我蜷缩在角落里,等待 R 命令之神或算法效率之神来敲我的人体工学键盘 :-(

set.seed(1001)

height <- rnorm(6, mean = 1, sd = 0.2)
weight <- rnorm(6, mean = 100, sd = 15)
id     <- 1:6

dd <- data.frame(id, height, weight)

# Here's the function I came up with
ReorderDataByColumn <- function(x, column) {
  ordered.indices <- order(x[ ,paste(column)])

  return(x[ordered.indices, ])
}

#And here are its results
> ReorderDataByColumn(dd, column = "height")
  id    height    weight
4  4 0.4986928  76.09430
5  5 0.8885377 104.53967
3  3 0.9629449  86.38809
2  2 0.9644905  90.65584
6  6 0.9712881 124.51589
1  1 1.4377296 116.37253

> ReorderDataByColumn(dd, column = "weight")
  id    height    weight
4  4 0.4986928  76.09430
3  3 0.9629449  86.38809
2  2 0.9644905  90.65584
5  5 0.8885377 104.53967
1  1 1.4377296 116.37253
6  6 0.9712881 124.51589

最佳答案

我不会因为格式正确的问题而从事打击业务。我认为代码可读且合理。如果你想把它收紧一点,你可以通过使用“[[”并在“[”中创建索引来删除 paste() 操作:

ReorderDataByColumn2 <- function(x, column) {
    return(x[ order( x[[column]]), ])
}

编辑:添加哈德利的建议(除了我认为你还需要 do.call):
 ReorderDataByColumn2 <- function(x, column, desc=FALSE) {
    return(
      x[ do.call( order, x[ , column, drop=FALSE ]  ), ]
      ) }

如果需要,您可以添加一些错误检查:
ReorderDataByColumn2 <- function(x, column) {
    if(column %in% names(x)){return(x[ order( x[[column]]), ])
     }else{ cat("Column ", column, "not in dataframe ", deparse(substitute(x))) }
}

关于r - 有没有更简单的方法来按列的值重新排序数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6635999/

10-12 17:41