2017-11-27 2 views
4

일부 큰 데이터가 있는데 부분적으로 매우 비슷한 변수로 구성되어 있습니다. 일부 변수는 값이 없거나 (예 : 아래 예에서는 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 % 이상의 경우에 같은 값을 가진 모든 쌍을 포함하는 목록을 인쇄해야합니다. 내가 X1, X3 및 X4의 유사성을 식별하기 위해 관리

# 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) 

: 여기에 지금까지 무엇을 가지고 있습니다. x2와 x5의 유사성 (즉, 라벨이 다른 유사한 변수)은 본인의 기능에 의해 발견되지 않습니다. 또한, 제 기능이 매우 느립니다.

질문 : : 어떻게 계산 효율적인 방법으로 모든 유사한 변수를 식별 할 수 따라서, 나는 다음과 같은 질문을?

답변

2

당신의 열을 비교하기 위하여를 먼저 숫자 값이 필요합니다. 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 & 3, 1 & 4, 2 & 53 & 4의 경우 80 % 이상이 서로 동일하다.

참고 : 비교 값 중 하나 또는 둘 모두가 NA 인 경우 일치하지 않는 것으로 간주됩니다.

+0

고마워요, 정확히 내가 찾고 있었던 것입니다. – JSP

2

는 캐럿 패키지에는 또한 상관 관계 변수와 다른 사람의 직계 조합입니다 변수를 발견하는 기능이있다 :

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

+0

답장을 보내 주셔서 감사합니다. 'findCorrelation' 함수는 누락 된 값 때문에 약간의 에러를주었습니다. 나는 'caret'에 해결 방법이 있다고 상상할 수 있지만, Ken S.의 해결책이 나에게 도움이되기 때문에 나는 그의 대답을 받아 들였다. – JSP

+0

"cor"함수를 호출 할 때 매개 변수를 추가해야합니다. na.rm = True –