原始问题: 我的工作要求我经常分析大数据集的数据 - 基数,关系,唯一性,。 。 。经常这样做。目的是使用R来分析数据并在R Markdown中创建报告。
我的问题是: 1.数据被加载到R数据帧中 2.如何识别数据库术语中的复合主键?
例如,我有一个包含75,000条记录的表。我做了一个rapply来获得每个变量的唯一计数。但是,除非其中一个变量的计数为75,000,否则没有单个主键。换句话说,没有一个变量可用于唯一地识别单个观察。
然后,目标变为寻找唯一标识每个观察(行)的变量(列)的组合。这可以是160可变数据帧/表中的两个,三个或四个变量/列。当然,总是存在重复,其中没有唯一标识每一行或观察的键组合。
我已成功完成'for'循环(丑陋),但认为有一些优雅,更有效的方法。
如何找到构成COMPOSITE PRIMARY KEY的变量?
修改后的问题:
############### 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
问题是:有没有办法确定哪些列组合成一个简单,雄辩的记录的唯一实例,而无需编写无限循环?
如果没有,在R中编写for循环的最佳方法是什么,它会告诉你组合的每个组合,是否具有等于整个数据帧计数的唯一计数? / p>
希望这比泥泞更清楚,这对某人来说是一个简单的问题。
感谢您的帮助!
答案 0 :(得分:0)
不幸的是,没有。有几种方法可以识别主键,无论是单键还是复合键。但是,如果有10列,理论上,制作唯一键可能需要10列。这意味着您必须检查第1列到第10列的唯一性,然后是第1列和第2列,接着是第1列和第3列,然后是第1列和第4列。 。 。等等。我认为这将归结为检查n!组合。因此,如果您有10列,则可能需要检查3,628,800种组合的唯一性。实际上,2-4列通常是复合键中的最大键数。但是,这仍然可以通过大量的检查来验证。只是我的意见,但它归结为建模者了解数据和验证假设。如果您找到更好的答案,请告诉我们,
答案 1 :(得分:-1)
通常,您应该知道构建数据库或架构的人员哪个密钥是主密钥。这不是一个数据驱动的练习。
如果你是那个开始构建基本上架构工作的人,那么你唯一要做的就是尝试和错误。我来自医疗保健行业。例如,索赔号通常是主键的首要嫌疑人,但如果您在文件上有三个类似的索赔号怎么办?
这通常是域名的事情。例如,如果两个表之间的匹配率应该> 85%,并且两个表上只有一个键(它们的名称可能非常不同),那么就是那个,那就是那个。
如果匹配是一对一,一对多或多对多,则复杂的事情也是如此。