我想创建一个使用算法搜索主键的函数。该算法仅测试第一列是否具有所有唯一值,如果不是,则测试第一列和第二列,依此类推,直到不再有列为止。输出是“PRIMARY KEY(...)”,其中......是用逗号分隔的键列的名称。如果没有满足条件的组合,则输出应为“PRIMARY KEY()”
我已经解决了满足条件的情况。如果不满足,则抛出错误,我希望输出为“PRIMARY KEY()”。
这是我的尝试:
<$
并且未通过测试的示例data.frame(即“PRIMARY KEY()”应该是输出,而不是错误消息)。
get_key <- function(x){
i <- 0
repeat {
i <- i + 1
y <- x[1:i]
if (!anyDuplicated(y)) break
}
return(paste0("PRIMARY KEY (", paste(names(y), collapse = ", "), ")"))
}
答案 0 :(得分:0)
下面使用略微修改的测试数据来显示三种不同的情况。接近原始代码但使用for循环而不是重复。请注意x[,1:i]
- 省略逗号意味着索引行而不是列。
df <- structure(list(char = c("a", "b", "b"), num = c(1.1, 2.2, 2.2
), int = c(1L, 2L, 3L)), .Names = c("char", "num", "int"), row.names =
c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"))
get_key <- function(x) {
for (i in 1:ncol(x)) {
y <- x[,1:i]
if (!anyDuplicated(y)) {
return(paste0("PRIMARY KEY (", paste(names(y), collapse = ", "), ")"))
}
}
return("PRIMARY KEY ()")
}
df
# # A tibble: 3 × 3
# char num int
# <chr> <dbl> <int>
# 1 a 1.1 1
# 2 b 2.2 2
# 3 b 2.2 3
get_key(df)
# [1] "PRIMARY KEY (char, num, int)"
> get_key(df[1:2,])
# [1] "PRIMARY KEY (char)"
> get_key(df[2:3, 1:2])
# [1] "PRIMARY KEY ()"
答案 1 :(得分:0)
您不想检查列的所有组合,而不仅仅是i:x
个切片吗?像例如此
get_key <- function(x) {
ind_combs <- lapply(1:nrow(x), function(y) combn(1:nrow(x), y))
for (i in 1:length(ind_combs)) {
for (j in 1:ncol(ind_combs[[i]])) {
if (!anyDuplicated(x[, ind_combs[[i]][, j]])) {
return(paste0("PRIMARY KEY (", paste(names(x[, ind_combs[[i]][, j]]), collapse = ", "), ")"))
}
}
}
return("PRIMARY KEY ()")
}