【问题标题】:Data cleaning: Function to find very similar variables数据清洗:查找非常相似的变量的函数
【发布时间】:2018-05-10 21:27:54
【问题描述】:

我有一些大数据,其中部分包含非常相似的变量。一些变量有缺失值(例如下例中的 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 的相似性(即具有不同标签的相似变量)。此外,我的功能很慢。因此,我有以下问题:

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

【问题讨论】:

    标签: r function bigdata similarity data-cleaning


    【解决方案1】:

    为了比较您的列,您首先需要数值。您可以使用gsub() 仅提取数值,然后转换为数值。完成此转换后,您就可以开始了:

    df <- apply(df, 2, function(x) as.numeric( gsub("[^0-9]", "", x) ))
    

    现在您可以先使用combn(5, 2) 来比较所有列,以获取您想要比较的所有列对。然后您可以使用它来比较列并计算相等条目的百分比。

    combs <- combn(ncol(df), 2)
    
    res <- apply(combs, 2, function(x){
      sum(df[, x[1]] == df[, x[2]], na.rm = TRUE)/nrow(df)
    })
    
    thresh <- 0.8
    combs[, res > thresh]
    #      [,1] [,2] [,3] [,4]
    # [1,]    1    1    2    3
    # [2,]    3    4    5    4
    

    因此,在 80% 以上的情况下,1 &amp; 31 &amp; 42 &amp; 53 &amp; 4 列彼此相等。

    注意:如果一个或两个比较值有NA,这将被视为不匹配!

    【讨论】:

    • 非常感谢,这正是我想要的。
    【解决方案2】:

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

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

    【讨论】:

    • 非常感谢您的回答。由于缺少值,findCorrelation 函数给了我一些错误。我可以想象caret 有一个解决方法,但由于 Ken S. 的解决方案对我有用,我接受了他的回答。
    • 调用“cor”函数时,必须加上参数:na.rm=True
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2021-02-04
    • 2019-03-15
    • 2021-11-21
    • 2018-07-01
    相关资源
    最近更新 更多