2009-08-19 32 views
4

說明:我從第一次發佈時更改了示例。我的第一個例子太簡單了,無法解決真正的問題。R - 下標解決方案混合合併?

我有兩個數據框在一列中排序不同。我想匹配一列,然後合併來自第二列的值。第二列需要保持相同的順序。

所以我有這樣的:

state<-c("IA","IA","IA","IL","IL","IL") 
value1<-c(1,2,3,4,5,6) 
s1<-data.frame(state,value1) 
state<-c("IL","IL","IL","IA","IA","IA") 
value2<-c(3,4,5,6,7,8) 
s2<-data.frame(state,value2) 

s1 
s2 

返回此:

> s1 
    state value1 
1 IA  1 
2 IA  2 
3 IA  3 
4 IL  4 
5 IL  5 
6 IL  6 
> s2 
    state value2 
1 IL  3 
2 IL  4 
3 IL  5 
4 IA  6 
5 IA  7 
6 IA  8 

,我想這一點:

state value1 value2 
1 IA  1  6 
2 IA  2  7 
3 IA  3  8 
4 IL  4  3 
5 IL  5  4 
6 IL  6  5 

我要自己開車傻試圖解決這個。似乎它應該是一個簡單的下標問題。

+1

玩具是這個例子嗎?例如,在這種情況下,狀態ID總是與相同的值1匹配(IA == 2,IL == 1),所以只要狀態ID在與在s1中一樣。如果value1是1:6,那完全不同。 – geoffjentry 2009-08-19 18:54:11

+0

非常好的一點。我簡化了我的例子。 IA並不總是== 2,所以這太簡單了。我會編輯我的問題。 – 2009-08-19 19:36:40

回答

3

有幾種方法可以做到這一點(畢竟是R),但我認爲最清楚的是創建索引。我們需要一個創建順序索引的函數(從一個觀察點開始並結束)。

seq_len(3) 
> [1] 1 2 3 

但是我們需要在每個分組變量(狀態)內計算這個索引。爲此,我們可以使用R的ave函數。它將數字作爲第一個參數,然後是分組因子,最後是要在每個組中應用的函數。

s1$index <- with(s1,ave(value1,state,FUN=seq_len)) 
s2$index <- with(s2,ave(value2,state,FUN=seq_len)) 

(注意使用的with,它告訴R鍵搜索環境/數據幀中的變量。這比使用S1 $值1,S2 $值2,等更好的做法)

現在我們可以簡單地合併(連接)兩個數據幀(通過兩個數據幀中存在的變量:狀態和索引)。

merge(s1,s2) 

其給出

state index value1 value2 
1 IA  1  1  6 
2 IA  2  2  7 
3 IA  3  3  8 
4 IL  1  4  3 
5 IL  2  5  4 
6 IL  3  6  5 

對於這項工作,應該有相同數目的在各數據幀的通過狀態的觀察。

[編輯:註釋爲清晰起見,代碼] [編輯:用來seq_len,而不是由哈德利的建議創建一個新的功能。]

+1

給予無限數量的猴子和無數的電腦,我仍然無法想出。謝謝你mucho! – 2009-08-19 20:25:32

+0

這3行是怎麼回事?你能詳細說明一下嗎? – 2009-08-19 21:10:42

+1

您可以用'seq_len'替代'FUN = function(x)1:length(x))' – hadley 2009-08-20 02:07:33

0

注意:檢查上面的答案第五評論。解決方案應該是

s1$index <- with(s1,ave(value1,state,FUN=seq_along)) 
s2$index <- with(s2,ave(value2,state,FUN=seq_along)) 

測試和工作。