Есть ли более простой способ переупорядочить данные по значениям столбца? - PullRequest
4 голосов
/ 09 июля 2011

Я написал эту крошечную оболочку около 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

Ответы [ 2 ]

4 голосов
/ 09 июля 2011

Я не увлекаюсь умелым бизнесом для правильных вопросов. И я думал, что код был читабельным и разумным. Если вы хотите немного затянуть его, вы можете отказаться от операции вставки (), используя «[[» и создав индекс внутри «[»:

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))) }
}
2 голосов
/ 10 июля 2011

См. Функцию аранжировки в plyr:

library(plyr)
arrange(mtcars, cyl)
arrange(mtcars, desc(cyl))
arrange(mtcars, vs, am)

Определение функции довольно просто:

arrange <- function (df, ...) {
    ord <- eval(substitute(order(...)), df, parent.frame())
    unrowname(df[ord, ])
}

И он работает по процессу, очень похожему на subset в базе R.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...