R: Сортировать несколько столбцов по другому data.frame? - PullRequest
8 голосов
/ 21 октября 2010

Я пытаюсь понять, как отсортировать один data.frame на основе нескольких столбцов в другом.Этот вопрос делает это с векторами .Может кто-нибудь предложить способ сделать эквивалент с data.frames?

Вот некоторые примеры данных.

x1 <- data.frame(a=1:5, b=letters[1:5], c=rnorm(5))
x2 <- data.frame(a=c(4,4,2), b=c("d", "d", "b"), d=rnorm(3))

Поэтому я хочу отсортировать x2 по первым двум столбцам x1.Мои реальные данные намного сложнее, но это повторяет идею ...

Ответы [ 3 ]

13 голосов
/ 21 октября 2010

Это действительно зависит от того, как на самом деле выглядят ваши данные.Как это выглядит сейчас, вам нужен только один столбец для сортировки, и это легко сделать с помощью:

x2[order(match(x2[,1],x1[,1])),]

Если вам нужно более одного столбца, это становится немного сложнее.Вам нужно будет указать, по какой из них вы хотите сначала отсортировать, и по какой секунде, например:

x1 <- data.frame(a=rep(1:3,2), b=rep(letters[2:4],each=2), c=rnorm(6))
x2 <- data.frame(a=c(3,3,2), b=c("c", "d", "b"), d=rnorm(3))


x2[order(match(
  paste(x2[,1],x2[,2]),
  paste(x1[,1],x1[,2]))
),]

. Эта сортировка выполняется сначала по первому столбцу, а затем по второму.Вы должны иметь в виду, что вам нужны все комбинации в x2, а также в x1.T

2 голосов
/ 22 января 2013

Это можно сделать точно, используя plyr.Ответ Джориса сработал бы неплохо, но потенциально мог бы ошибиться при объединении строк:

> paste ("A A","B")
[1] "A A B"
> paste ("A","A B")
[1] "A A B"

Вы можете получить точный ответ, используя join.keys и match:

x1 <- data.frame(a=rep(1:3,2), b=rep(letters[2:4],each=2), c=rnorm(6))
x2 <- data.frame(a=c(3,3,2), b=c("c", "d", "b"), d=rnorm(3))

library(plyr)
keys<-join.keys(x1,x2,c("a","b"))
matches<-match(keys$y,keys$x,nomatch=(keys$n+1))
x2[order(matches),]

Thisдолжны обрабатывать большинство крайних случаев, несоответствующие размеры списка и т. д. Элементы без совпадения в обоих столбцах индекса помещаются в конец списка.

2 голосов
/ 21 октября 2010

Прикрепите столбец ранга к соответствующим столбцам x1:

len <- dim(x1)[1]
x1. <- cbind(x1[,1:2], rank=1:len)

Объединение в x2 (это похоже на SQL-соединение; см. Документацию по слиянию, чтобы узнать, как определить, что происходит, если есть такие неоднозначности, какнесколько совпадений или нет совпадений):

x2. <- merge(x2, x1.)

Сортировка:

x2.[order(x2.[,'rank']),]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...