2014-09-03 32 views
2

我有一個表作爲數據框的行如下:在R:重新排序基於那些在另一個表

tab1 <- as.table(matrix(c(8,6,9,0,8,4,0,12,7,10), ncol = 2, byrow = FALSE, 
    dimnames = list(site = c("beta", "alpha", "gamma", "theta", "delta"), 
    count = c("low", "high")))) 
> tab1 
     count 
site low high 
beta 8 4 
alpha 6 0 
gamma 9 12 
theta 0 7 
delta 8 10 

和映射網站名稱的siteID的一個data.frame:

data.frame(site = c("alpha", "beta", "gamma", "delta", "theta"), siteId = c(1102, 3154, 9000, 1101, 1103)) 
    site siteId 
1 alpha 1102 
2 beta 3154 
3 gamma 9000 
4 delta 1101 
5 theta 1103 

最後,我有一個包含這些的siteID的和其他一些變量data.frame:

data.frame(siteId = c(1101, 1102, 1103, 3154, 9000), treatment = c("A", "B", "C", "E", "F")) 
    siteId treatment 
1 1101   A 
2 1102   B 
3 1103   C 
4 3154   E 
5 9000   F 

我需要什麼,能夠做我s到訂購的相同方式,在TAB1的排奉命最後的數據幀中的列,所以它應該產生:

siteId treatment 
1 3154   E 
2 1102   B 
3 9000   F 
4 1003   C 
5 1001   A 

我怎麼能做到這一點,沒有複雜的循環互動?實際的數據集非常大,因此循環會花費比我想要的更多的時間。

+0

感謝您發現相關問題,它比我的稍微簡單一些,但確實非常相似。 – 2014-09-03 19:23:45

回答

2

您可以通過match從不同數據框中獲取ID。順便說一下,我將數據框a中的epsilon更改爲theta,因爲tab1中沒有epsilon。

tab1 <- as.table(matrix(c(8,6,9,0,8,4,0,12,7,10), ncol = 2, byrow = FALSE, 
               dimnames = list(site = c("beta", "alpha", "gamma", "theta", "delta"), 
                       count = c("low", "high")))) 


a = data.frame(site = c("alpha", "beta", "gamma", "delta", "theta"), siteId = c(1102, 3154, 9000, 1101, 1103)) 
b = data.frame(siteId = c(1101, 1102, 1103, 3154, 9000), treatment = c("A", "B", "C", "E", "F")) 

# put a in the order of tab1 
a = a[match(a$site,rownames(tab1)),] 

# put b in order of a 
b = b[match(a$siteId, b$siteId),] 

> b 
# siteId treatment 
#4 3154   E 
#2 1102   B 
#5 9000   F 
#3 1103   C 
#1 1101   A 
+0

優秀的答案,謝謝!它完全符合我的要求。 – 2014-09-03 19:25:00

相關問題