原問題: 我的工作需要我頻繁地處理大數據集上的數據 - 基數,關係,唯一性。 。 。 。,並經常這樣做。目的是使用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循環的最佳方式是什麼,它會告訴你每個組合的列的組合,有一個唯一的計數等於整個數據幀的計數?
希望這比泥更清楚,這對某個人來說是一個簡單的問題。
感謝您的幫助!
歡迎來到SO。請閱讀[問]以及如何創建[可重現的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)並相應地編輯您的問題。 – Heroka
這是不是很清楚你在問什麼。可能有許多列組合可能是複合鍵。如果出現這種情況,你會選擇哪種組合?您可以通過'nrow(unique(df))== nrow(df)'來測試是否存在組合鍵。如果該命令給出「FALSE」,則不存在密鑰。 – nicola
希望添加樣本數據可以讓我更清楚地知道我在找什麼。我知道可以有許多組合來唯一標識一行,但在大多數整潔數據集的實例中,您將擁有一定數量的列來標識行/觀察值。例如,一個PERSON表可能有一個代理鍵,但要確定該人的居住地點,您可能會將一個位置表映射到該人(兩個鍵),並且如果您需要歷史記錄(當他們移入,移出和移回時到那個地址),你也可以添加一個日期字段(三個鍵)。希望我清楚。 – Shanemeister