2014-10-09 47 views
5

我有一個非常龐大而複雜的數據集,有很多公司的觀察。這些公司的一些觀察結果是多餘的,我需要制定一個關鍵將冗餘觀測映射到單一觀測。然而,唯一能說出他們是否代表同一家公司的唯一方法是通過各種變量的相似性。我認爲適當的方法是基於各種條件或甚至某種傾向分數匹配的一種聚類。也許我只需要靈活的工具來製作複雜的相似矩陣。R中的許多維度上的聚類/匹配

不幸的是,我不太清楚在R中如何去解決這個問題。對於聚類和分類,我所見過的大多數工具似乎都是用數字距離或分類數據來實現的,但似乎並不允許多個條件或用戶指定的條件。

下面我試圖創建一個更小的公開示例,我正在使用的數據以及我試圖產生的結果。有一些條件必須適用,例如,位置必須相同。有一些功能可以相互關聯,例如var1和var2。然後有一些功能可能會相互關聯,但它們不能相互衝突,如var3。

一個額外的複雜層面是,我試圖用來映射冗餘觀察的關聯類型各不相同。例如,id1和id2是兩次冗餘地輸入到數據中的同一公司。在一個地方它的名字是「蘋果」,另一個是「紅蘋果」。他們共享相同的位置,var1值和var3(調整格式後)。同樣,ID3,5和6也只是一家公司,儘管每個公司的許多輸入是不同的。一些集羣將識別多個觀測值,其他集羣只有一個觀測值。理想情況下,我希望找到一種方法來根據多個條件對觀察結果進行分類或關聯,例如: 1.測試位置是否相同 2.測試var3是否不同 3.測試名稱是否爲子字符串別人的 4.測試名稱的編輯距離 5.測試觀察

不管怎麼說,希望有更好的之間VAR1和VAR2的相似性,對於更靈活的工具比我發現或有人有這方面的經驗類型的數據工作R.任何和所有的建議和意見非常感謝!

數據

id name  location var1 var2 var3 
1 apples  US  1  abc  12345 
2 red apples US  1  NA  12-345 
3 green apples Mexico 2  def  235-92 
4 bananas  Brazil 2  abc  NA 
5 oranges  Mexico 2  NA  23592 
6 green apple Mexico NA  def  NA 
7 tangerines Honduras NA  abc  3498 
8 mango   Honduras 1  NA  NA 
9 strawberries Honduras NA  abcd 3498 
10 strawberry Honduras NA  abc  3498 
11 blueberry  Brazil 1  abcd 2348 
12 blueberry  Brazil 3  abc  NA 
13 blueberry  Mexico NA  def  1859 
14 bananas  Brazil 1  def  2348 
15 blackberries Honduras NA  abc  NA 
16 grapes  Mexico 6  qrs  NA 
17 grapefruits Brazil 1  NA  1379 
18 grapefruit Brazil 2  bcd  1379 
19 mango   Brazil 3  efaq NA 
20 fuji apples US  4  NA  189-35 

結果

id name  location var1 var2 var3  Result 
1 apples  US  1  abc  12345  1 
2 red apples US  1  NA  12-345  1 
3 green apples Mexico 2  def  235-92  3 
4 bananas  Brazil 2  abc  NA   4 
5 oranges  Mexico 2  NA  23592  3 
6 green apple Mexico NA  def  NA   3 
7 tangerines Honduras NA  abc  3498  7 
8 mango   Honduras 1  NA  NA   8 
9 strawberries Honduras NA  abcd 3498  7 
10 strawberry Honduras NA  abc  3498  7 
11 blueberry  Brazil 1  abcd 2348  11 
12 blueberry  Brazil 3  abc  NA   11 
13 blueberry  Mexico NA  def  1859  13 
14 bananas  Brazil 1  def  2348  11 
15 blackberries Honduras NA  abc  NA   15 
16 grapes  Mexico 6  qrs  NA   16 
17 grapefruits Brazil 1  NA  1379  17 
18 grapefruit Brazil 2  bcd  1379  17 
19 mango   Brazil 3  efaq NA   19 
20 fuji apples US  4  NA  189-35  20 

預先感謝您的時間和幫助!

+0

你在這裏有什麼是我們所說的「硬」問題。我認爲在每個變量中創建一個數字距離的方法是使用http://en.wikipedia.org/wiki/Levenshtein_distance。然後,您可以爲匹配的總距離定義一些公差。編輯:我會盡量嘲弄一些。 – stanekam 2014-10-09 22:01:27

+0

還有一些軟件包可以幫助您檢查與角色的相似性。它可以讓你斷定'蘋果'和'紅蘋果'在同一個簇中。 – 2014-10-09 22:10:25

+0

@Adii_將不會有任何包裝將匹配''蘋果''到''紅蘋果'',而不是其中的任何其他蘋果。 – stanekam 2014-10-09 22:17:01

回答

0
library(stringdist) 
getMatches <- function(df, tolerance=6){ 
    out <- integer(nrow(df)) 
    for(row in 1:nrow(df)){ 
    dists <- numeric(nrow(df)) 
    for(col in 1:ncol(df)){ 
     tempDist <- stringdist(df[row, col], df[ , col], method="lv") 

     # WARNING: Matches NA perfectly. 
     tempDist[is.na(tempDist)] <- 0 
     dists <- dists + tempDist 
    } 
    dists[row] <- Inf 

    min_dist <- min(dists) 
    if(min_dist < tolerance){ 
     out[row] <- which.min(dists) 
    } 
    else{ 
     out[row] <- row 
    } 
    } 
    return(out) 
} 

test$Result <- getMatches(test[, -1]) 

其中test是您的數據。這可能肯定需要一些改進,並且肯定需要一些後處理。這會創建一個最接近匹配索引的列。如果它在給定的容差範圍內找不到匹配,它將返回其自身的索引。

編輯:我會再嘗試一些。

+0

感謝您的幫助。我會稍微修改一下,看看我能否得到這樣的工作。 – DaedalusBloom 2014-10-10 13:54:53