数据清理:找到非常相似的变量的函数

时间:2017-11-27 15:23:54

标签: r function bigdata similarity data-cleaning

我有一些大数据,部分由非常相似的变量组成。一些变量具有缺失值(例如下面示例中的x3和x5),并且一些变量是相似的,但具有不同的标签(例如x2和x5)。为了清理我的数据,我想识别并最终删除这些类似的变量。我正在尝试编写一个函数,它返回所有类似变量对的列名。以下是一些示例数据:

# Example data

set.seed(222)

N <- 100
x1 <- round(rnorm(N, 0, 10))
x2 <- round(rnorm(N, 10, 20))
x3 <- x1
x3[sample(1:N, 7)] <- NA
x4 <- x1
x4[sample(1:N, 5)] <- round(rnorm(5, 0, 10))
x5 <- x2
x5 <- paste("A", x5, sep = "")
x5[sample(1:N, 15)] <- NA

df <- data.frame(x1, x2, x3, x4, x5)

df$x1 <- as.character(df$x1)
df$x2 <- as.character(df$x2)
df$x3 <- as.character(df$x3)
df$x4 <- as.character(df$x4)
df$x5 <- as.character(df$x5)

head(df)

如您所见,x1,x3和x4非常相似;和x2和x5也非常相似。我的函数应该打印一个列表,其中包括80%或更多情况下具有相同值的所有对。这是我到目前为止所得到的:

# My attempt to write such a function

fun_clean <- function(data, similarity) {

  output <- list()
  data <- data[complete.cases(data), ]

  for(i in 1:ncol(data)) {

    if(i < ncol(data)) {

      for(j in (i + 1):ncol(data)) {

        similarity_ij <- sum(data[ , i] == data[ , j]) / nrow(data)

        if(similarity_ij >= similarity) {

          output[[length(output) + 1]] <- colnames(data)[c(i, j)]

        }
      }
    }
  }

  output

}

fun_clean(data = df, similarity = 0.8)

我设法识别x1,x3和x4的相似性。我的函数找不到x2和x5的相似性(即具有不同标签的相似变量)。此外,我的功能很慢。因此,我有以下问题:

问题:如何以计算效率方式识别所有类似变量?

1 个答案:

答案 0 :(得分:2)

在插入符号包中,有一个功能可以发现相关变量以及其他变量的线性组合:

http://topepo.github.io/caret/pre-processing.html