2013-03-12 96 views
-3

我有一個包含兩列的數據框:name和action_id。名字經常有多個action_ids和action_ids也有多個名稱相關聯的,就像這樣:基於其他列的重疊值

name action_id 
Bob 1 
Bob 2 
Bob 3 
Tom 2 
Tom 1 
Bill 1 
Bill 3 

這裏是我的問題:我試圖指標名稱的基礎上的action_ids之間的重疊。所以如果一個名字與兩個action_id相關聯,並且另一個名字與相同的兩個action_ids相關聯,那麼這兩個action_ids之間的重疊是1.對於上面的數據,這個函數將在action_id 1和2,1之間返回重疊1在1和3之間,其他潛在重疊爲0。我描繪出了一個數據表,所有潛在的action_id重疊和那些重疊的情況下,像這樣:

1 2 3 
1 - 0 0 
2 1 - 0 
3 1 0 - 

我試圖解決這個由數據幀轉換到該索引的所有action_ids關聯的數據表與用戶一起使用,但在將該數據錶轉換爲僅顯示action_id的表中時遇到了困難,如上所示。

我想通過所有的數據循環,但我正在處理數百萬行 - 對於/如果循環在這裏沒有足夠的時間效率,所以我試圖找到一個基於向量的解決方案。

+1

這將是很好的給你的整個期望產出的具體指示,在這個例子中 – alexwhan 2013-03-12 01:32:35

+0

@ alexwhan他們已經給出了他們具體的期望輸出的例子,在後面的段落中。 – 2013-03-12 01:34:42

+0

我明白了,我的意思是它會出現,而不是「我正在想象......」實際上顯示數據 - 我並不想挑剔,但它通常會導致更快,更準確的反應。 – alexwhan 2013-03-12 01:37:22

回答

2

我覺得這個計算你想要的方式重疊:

overlap = function(df, id1, id2) { 
    id_by_name = tapply(df$action_id, df$name, unique) 
    ids_in_name = lapply(
    id_by_name, 
    function(x) { 
     all(c(id1, id2) %in% x) 
    } 
) 
    overlapping_names = names(ids_in_name)[unlist(ids_in_name)] 
    if (length(overlapping_names) >= 2) { 
    return(1) 
    } else { 
    return(0) 
    } 
} 

輸出:

> overlap(df, 1, 2) 
[1] 1 
> overlap(df, 2, 3) 
[1] 0