最初的问题:我的工作要求我经常在大型数据集(基数,关系,唯一性等)上分析数据。。。。,并且经常这样做。目的是使用R来分析数据并在R Markdown中创建报告。
我的问题是: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
Run Code Online (Sandbox Code Playgroud)
接下来是一个具有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
Run Code Online (Sandbox Code Playgroud)
最后,一个数据帧包含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
Run Code Online (Sandbox Code Playgroud)
问题是:是否有一种方法可以以简单,雄辩的方式确定合并的哪些列构成记录的唯一实例,而无需编写无休止的for循环?
如果没有,那么用R编写for循环的最佳方法是什么,它会告诉您所组合的列的每个组合,其唯一计数等于整个数据帧的计数?
希望这比泥还清晰,这对于某人来说是一个简单的问题。
谢谢你的帮助!
很不幸的是,不行。有多种方法可以识别主键,无论是单键还是复合键。但是,如果有 10 列,理论上,创建唯一键可能需要 10 列。这意味着您必须检查第一列到第 10 列的唯一性,然后是第 1 列和第 2 列,然后是第 1 列和第 3 列,然后是第 1 列和第 4 列。。。等等。我认为这可以归结为检查n!组合。因此,如果您有 10 列,您可能需要检查 3,628,800 个组合的唯一性。实际上,2-4 列通常是复合键中键的最大数量。不过,这仍然可以通过大量检查来验证。这只是我的意见,但归根结底是建模者了解数据并验证假设。如果您找到更好的答案,请告诉我们,
| 归档时间: |
|
| 查看次数: |
2759 次 |
| 最近记录: |