使用重复循环查找 data.frame 的键
find key of data.frame using repeat loop
我想创建一个使用算法搜索主键的函数。该算法仅测试第一列是否具有所有唯一值,如果没有,则测试第一列和第二列,依此类推,直到没有更多列。输出为 "PRIMARY KEY (...)",其中 ... 是以逗号分隔的键列的名称。如果没有满足条件的组合,输出应该是"PRIMARY KEY ()"
满足条件的我已经解决了。当不满足时,会抛出错误,我希望输出为 "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 = ", "), ")"))
}
和一个未通过测试的示例 data.frame(即 "PRIMARY KEY ()" 应该是输出,而不是错误消息)。
df <- structure(list(char = c("a", "b", "b"), num = c(1.1, 2.2, 2.2
), int = c(1L, 2L, 2L)), .Names = c("char", "num", "int"), row.names = c(NA,
-3L), class = c("tbl_df", "tbl", "data.frame"))
下面使用稍微修改过的测试数据来展示三种不同的情况。接近原始代码,但使用 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 ()"
您不想检查列的所有组合,而不仅仅是 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 ()")
}
我想创建一个使用算法搜索主键的函数。该算法仅测试第一列是否具有所有唯一值,如果没有,则测试第一列和第二列,依此类推,直到没有更多列。输出为 "PRIMARY KEY (...)",其中 ... 是以逗号分隔的键列的名称。如果没有满足条件的组合,输出应该是"PRIMARY KEY ()"
满足条件的我已经解决了。当不满足时,会抛出错误,我希望输出为 "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 = ", "), ")"))
}
和一个未通过测试的示例 data.frame(即 "PRIMARY KEY ()" 应该是输出,而不是错误消息)。
df <- structure(list(char = c("a", "b", "b"), num = c(1.1, 2.2, 2.2
), int = c(1L, 2L, 2L)), .Names = c("char", "num", "int"), row.names = c(NA,
-3L), class = c("tbl_df", "tbl", "data.frame"))
下面使用稍微修改过的测试数据来展示三种不同的情况。接近原始代码,但使用 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 ()"
您不想检查列的所有组合,而不仅仅是 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 ()")
}