r之数据清洗: Function to find very similar variables

exmyth 阅读:66 2024-12-31 21:38:35 评论:0

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

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

请您参考如下方法:

为了比较您的列,您首先需要数值。您可以使用 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 

所以 1 & 31 & 42 & 53 & 4 是相等的在80%以上的情况下是相互的。

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


标签:程序员
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号