我正在尝试理解如何根据另一列中的多个列对一个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进行排序。我的实际数据要复杂得多,但这复制了这个想法......
答案 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.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),]
这应处理大多数边缘情况,列表大小不匹配等。索引列中没有匹配项的项目放在列表的末尾。