使用重复循环查找data.frame的关键字

时间:2018-02-25 20:09:37

标签: r loops primary-key repeat

我想创建一个使用算法搜索主键的函数。该算法仅测试第一列是否具有所有唯一值,如果不是,则测试第一列和第二列,依此类推,直到不再有列为止。输出是“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 = ", "), ")"))
}

2 个答案:

答案 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 ()")
}