2015-06-10 68 views
1

我使用的是R 3.1.3,我有這樣的數據;在R中做類似的標識符

id_1 <- c('a','a','b','c','d','e') 
id_2 <- c('a','f','f','g','g','e') 

我想使數據像;

id_common <- c('1','1','1','2','2','3') 

的情況是,我們在第1期和2,因爲在這些時期的分裂或合併不同的管理寄宿生(id_1和​​)的數據,我們希望產生一個新的房客標識,使它們相媲美的使用新標識符(id_common)進行彙總。在這種情況下例如,a一個部分用b合併,成爲這些週期之間f,所以想在週期2治療週期1 abaf爲名爲1一個基團和聚合兩個時期數據在這個水平上進行比較。

當然,id_common應該是覆蓋兩個期間的最精確的ID(它不應該是id_common <- c('1','1','1','1','1','3'))。有沒有什麼好主意輕鬆做到這一點?

事實上,我的數據中有兩個以上的時間段,但我認爲我可以輕鬆修改您的建議策略,以適應兩個以上的時間段。

預先感謝您,

跟進;

我想我可以通過下面的代碼做到這一點,但這可能有點混亂。 (我做了標記基於id_common字符串)。

id_common <- id_1 
elements <- unique(id_common) 
for (element in elements){ 
    map1 <- vector() 
    map1 <- id_2[id_1==element] 
    map2 <- id_1[which(id_2 %in% map1)] 
    if (setequal(map2,element) == F){ 
     while (setequal(map2,element) == T){ 
     map1 <- vector() 
     map1 <- id_2[which(id_1 %in% map2)] 
     map2 <- id_1[which(id_2 %in% map1)] 
     } 
     } 
    id_common[which(id_1 %in% map2)]<- paste(unique(map2),collapse="+") 
} 
+2

好吧,那我不明白你是什麼真正追求 – akrun

回答

0

好像你是在說區域ab,並f對應於區1cdg對應於2,並且e對應於3

一個簡單的方法來做到這一點是讓一個列表,然後堆列表,然後合併與這兩個ID的數據幀:

id_key = list(`1`=c('a','b','f'), `2`=c('c','d','g'), `3`=c('e')) 
stack_id <- stack(id_key) 

然後,你可以用它充當關鍵這個數據幀合併。

+0

對不起,我的混亂問題, 是的,我想生成'key'後做你的推薦代碼,但問題是我的數據是大規模和大非常低效地將他們的ID分類爲諸如1,2和3的組。所以,我的問題是如何自動從'id_1'和'id_2'創建組(在本例中爲列表元素)。 – user3467565

+0

你會如何確定舊密鑰到新密鑰的映射? – Michal

+0

由'id_1'和'id_2'的位置,例如第5個位置的區域在時期1被稱爲'd',在時期2被稱爲'g'。最後,我可以找到一些方法來解決這個問題,在「跟進」中,所以請檢查一下,如果你有興趣。謝謝! – user3467565