2015-09-30 30 views
1

原問題: 我的工作需要我頻繁地處理大數據集上的數據 - 基數,關係,唯一性。 。 。 。,並經常這樣做。目的是使用R來分析數據並在R Markdown中創建報告。R編程:識別複合鍵

我的問題是: 1.將數據加載到R數據框中 2.如何確定數據庫術語中將稱爲複合主鍵?

例如,我有一個包含75,000條記錄的表。我做了一個快速獲得每個變量的唯一計數。但是,除非其中一個變量的計數爲75,000,否則不存在單個主鍵。換句話說,沒有一個變量可以用來唯一地識別單個觀察值。

然後目標就是尋找唯一識別每個觀察(行)的變量(列)組合。這可以是160個可變數據框/表格中的兩個,三個或四個變量/列。而且,當然,在沒有唯一標識每行或關鍵字的鍵的組合中總會有重複。

我已經成功地完成了'for'循環(醜陋),但是認爲這樣做有一些優雅,高效的方式。

如何查找哪些變量構成組合主鍵?

改性問題:

############### Data1 - 2 columns - one PK 
    data1 <- data.frame(rep_len(1, length.out = 10)) 
    data1$PK <- rep_len(1:10, length.out = 10) 

    names(data1) <- c('DupData', 'PK') 
    rownames(data1) <- NULL 

    rapply(data1,function(x)length(unique(x)), how = 'unlist') 
DupData  PK 
     1  10 

length(unique(data1$PK)) 
[1] 10 

接下來是與3列的數據幀,但需要兩列,製成獨特的觀察:

############### Data2 - 3 columns - Two column composite PK 
data2 <- data1 
data2$PK <- rep_len(1:2, length.out = 10) 
data2$PK2 <- rep_len(2:6, length.out = 10) 
rapply(data2,function(x)length(unique(x)), how = 'unlist') 
DupData  PK  PK2 
     1  2  5 

length(unique(data2$DupData)) 
[1] 1 
length(unique(data2$PK)) 
[1] 2 
length(unique(data2$PK2)) 
[1] 5 
nrow(unique(data2[,c(1,2)], nmax = 3)) 
[1] 2 
nrow(unique(data2[,c(1,3)], nmax = 3)) 
[1] 5 
nrow(unique(data2[,c(2,3)], nmax = 3)) 
[1] 10 

最後,存在與4中的一個數據幀列/變量,它需要三列進行獨特的觀察:

############### Data3 - 4 columns - Three column composite PK 
data3 <- data1 
data3$PK <- c(0,0,0,0,0,0,0,0,1,1) 
data3$PK2 <- c(0,0,1,1,1,2,2,2,0,0) 
data3$PK3 <- c(1,2,0,1,2,0,1,2,0,1) 
rapply(data3,function(x)length(unique(x)), how = 'unlist') 
DupData  PK  PK2  PK3 
     1  2  3  3 

length(unique(data3$DupData)) 
[1] 1 
length(unique(data3$PK)) 
[1] 2 
length(unique(data3$PK2)) 
[1] 3 
length(unique(data3$PK3)) 
[1] 3 
nrow(unique(data3[,c(1,2)], nmax = 4)) 
[1] 2 
nrow(unique(data3[,c(1,3)], nmax = 4)) 
[1] 3 
nrow(unique(data3[,c(1,4)], nmax = 4)) 
[1] 3 
nrow(unique(data3[,c(1:4)], nmax = 4)) 
[1] 10 
nrow(unique(data3[,c(2,3)], nmax = 4)) 
[1] 4 
nrow(unique(data3[,c(2,4)], nmax = 4)) 
[1] 5 
nrow(unique(data3[,c(3,4)], nmax = 4)) 
[1] 9 
nrow(unique(data3[,c(2:4)], nmax = 4)) 
[1] 10 

T他的問題是:有沒有一種方法可以確定哪些列以簡單,雄辯的方式構成記錄的獨特實例,而無需編寫無限循環?

如果沒有,在R中寫入for循環的最佳方式是什麼,它會告訴你每個組合的列的組合,有一個唯一的計數等於整個數據幀的計數?

希望這比泥更清楚,這對某個人來說是一個簡單的問題。

感謝您的幫助!

+0

歡迎來到SO。請閱讀[問]以及如何創建[可重現的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)並相應地編輯您的問題。 – Heroka

+0

這是不是很清楚你在問什麼。可能有許多列組合可能是複合鍵。如果出現這種情況,你會選擇哪種組合?您可以通過'nrow(unique(df))== nrow(df)'來測試是否存在組合鍵。如果該命令給出「FALSE」,則不存在密鑰。 – nicola

+0

希望添加樣本數據可以讓我更清楚地知道我在找什麼。我知道可以有許多組合來唯一標識一行,但在大多數整潔數據集的實例中,您將擁有一定數量的列來標識行/觀察值。例如,一個PERSON表可能有一個代理鍵,但要確定該人的居住地點,您可能會將一個位置表映射到該人(兩個鍵),並且如果您需要歷史記錄(當他們移入,移出和移回時到那個地址),你也可以添加一個日期字段(三個鍵)。希望我清楚。 – Shanemeister

回答

0

不幸的是,沒有。有幾種方法可以識別主鍵,無論是單鍵還是複合鍵。但是,如果有10列,理論上可能需要10列來製作唯一的密鑰。這意味着您必須檢查第一列到第十列的唯一性,然後檢查第1列和第2列,然後檢查第1列和第3列,然後檢查第1列和第4列。 。 。等等。我認爲它會下降到檢查n!組合。所以如果你有10列,你可能需要檢查3,628,800個組合的唯一性。實際上,2-4列通常是組合鍵中的最大鍵數。但是,這仍然可以通過大量的檢查來驗證。只是我的意見,但歸結爲模型知道數據和驗證假設。如果您找到更好的答案,請告訴我們,