R:按另一个data.frame对多列进行排序?

时间:2010-10-21 17:20:36

标签: sorting r

我正在尝试理解如何根据另一列中的多个列对一个data.frame进行排序。这个问题does this with vectors。有人可以提出一种与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))

所以我想通过x1的前两列对x2进行排序。我的实际数据要复杂得多,但这复制了这个想法......

3 个答案:

答案 0 :(得分:13)

这实际上取决于您的数据真实情况。现在看起来,您只需要一列进行排序,这很容易通过以下方式完成:

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中x2中的所有组合。 Ť

答案 1 :(得分:2)

将排名列附加到x1的相关列:

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

合并到x2(这就像一个SQL连接;请参阅合并文档,了解如果存在多重匹配或不匹配等歧义时会发生什么情况):

x2. <- merge(x2, x1.)

类别:

x2.[order(x2.[,'rank']),]

答案 2 :(得分:2)

这可以使用plyr精确完成。 Joris的回答相当不错,但在组合字符串时可能会错过:

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

您可以使用join.keysmatch

获得准确的答案
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),]

这应处理大多数边缘情况,列表大小不匹配等。索引列中没有匹配项的项目放在列表的末尾。