![](/img/trans.png)
[英]How to sort multiple ascending/descending columns in a data.frame: R
[英]R: Sort multiple columns by another data.frame?
我試圖理解如何基於另一個列中的多個列對一個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))
所以我想用x1的前兩列對x2進行排序。 我的實際數據要復雜得多,但這復制了這個想法......
這實際上取決於您的數據真實情況。 現在看來,您只需要一列進行排序,這可以通過以下方式輕松完成:
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中的所有組合。 Ť
這可以使用plyr
精確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),]
這應該處理大多數邊緣情況,不匹配的列表大小等。索引列中沒有匹配項的項目放在列表的末尾。
將排名列附加到x1的相關列:
len <- dim(x1)[1]
x1. <- cbind(x1[,1:2], rank=1:len)
合並到x2(這就像一個SQL連接;請參閱合並文檔,了解如果存在歧義,例如多個匹配或沒有匹配,會發生什么):
x2. <- merge(x2, x1.)
分類:
x2.[order(x2.[,'rank']),]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.