簡體   English   中英

R:按另一個data.frame對多列進行排序?

[英]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.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),]

這應該處理大多數邊緣情況,不匹配的列表大小等。索引列中沒有匹配項的項目放在列表的末尾。

將排名列附加到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM