2014-10-11 2 views
0

일부 데이터 관리를 위해 R을 사용하려고합니다.비슷한 관찰 R 합치기

여러 개의 변수 (+200 열)와 많은 관찰 (+10,000 행)의 데이터 프레임이 있습니다. 누락 된 데이터가 많이 있고 복제 된 또는 완료되지 않은 관측이 있습니다. 한 관찰

여기

이 데이터 세트 예 (감사의 @aosmith에)입니다 한 사람 (1 개 행 = 1 유일한 사람) 같아야한다 : 내 관찰을 병합 할

dat = data.frame(email = c(rep(c("[email protected]", "[email protected]"), each = 2), NA), 
       name = c(NA, "Alfred C.", NA, "Bob V.", "Cathy L."), 
       var1 = c(2, 2, NA, NA, 1), 
       var2 = c(1, NA, 3, NA, 1), 
       var3 = c(NA, NA, 1, 0, 2), 
       var4 = c(0, NA, NA, NA, NA)) 

결국 있도록 한 행은 한 사람과 같습니다. 사람을 식별하기 위해 이메일을 사용합니다. 이메일이 없으면 모든 관측을 유지하고 싶습니다 (이메일이 누락 된 경우 R이 관측치를 삭제하는 것을 원하지 않습니다. 이메일이 없으면 유일한 관찰로 간주되는 모든 관찰).

우리가 동일한 이메일 주소를 발견 할 수있는 시간 동안 우리는 우리가 발견 한 후속 관측 (동일한 전자 메일 주소로)에서 얻은 데이터가 누락 된 경우 각 변수의 필드를 업데이트해야합니다. 하나 이상의 변수에 대해 이미 존재하는 데이터가있는 경우, R은 새로운 값을 저장할 때마다 R이 생성하기를 원합니다.

다음은 이해하기 쉬운 예입니다. 정보 때를 유지하여 같은 이메일과 행을 결합하는이 같은이 뭔가 (속으로

  email  name var1 var2 var3 var4 ... var200 
[email protected]  <NA>  2 1 NA 0 ... . 
[email protected] Alfred C. 2 NA NA NA ... . 
    [email protected]  <NA> NA 3 1 NA ... . 
    [email protected]  Bob V. NA NA 0 NA ... . 
      <NA> Cathy L. 1 1 2 NA ... . 

을 한 행에서 같은 사람에 대한 모든 정보를 유지하지만 :

우리는 다음과 같이 변환 할 필요가 우리는 사람이 이메일 주소와 동일 함을 확인할 수 없습니다 그래서 우리는이 이메일 NA 인 경우)는 독특한 사람이었다처럼 그것을 유지 :.이 작업을 수행 할 수있는 쉬운 방법이

  email   name  var1 var2 var3a var3b var4 ... var200 

    [email protected]  Alfred C.  2  1  NA  NA  0  .  . 
    [email protected]  Bob V.  NA  3  1  0  NA  .  . 
       <NA>  Cathy L.  1  1  2  .  NA  .  . 
    [email protected]   .   .  etc etc  etc etc etc etc 

있습니까? 나는 이틀 동안 dplyr와 tidyr로 고생하고있다 ... 결국, 한 행에는 email 변수를 사용하여 식별 할 수있는 정보가 포함되어야한다. 우리는 또한 우리가 한 사람에게 속한다고 말할 수없는 다른 모든 관찰을 유지할 필요가 있습니다.

도와 주셔서 감사합니다.

+0

이메일, 트위터 또는 둘 다를 가지고 있다는 것을 의미합니까? 누락 된 전자 메일 값이 NA로 표시됩니까? – aosmith

+0

트위터는 또 다른 변수 일 뿐이므로 혼란 스럽기 때문에 예제에서 삭제할 것입니다. 우리는 이메일 주소를 사용하여 같은 사람의 관찰을 합치기를 원합니다. – leakciM

+0

내 대답이 업데이트되었는데 도움이 될 수도 아닐 수도 있습니다. 재현 가능한 예제 데이터 세트 (예 : 데이터 세트에 누락 된 이메일 값이 없음)를 넣으면 도움이됩니다. – aosmith

답변

3

주제 내 각 변수의 값 수를 모를 경우를 대비해 옵션이 생겼습니다. 대부분의 단계가이를위한 것임을 알 수 있습니다 (별도의 열에 대해 별도의 이름 지정).

gather을 사용하여 데이터 집합을 긴 형식으로 바꾸고 각 제목과 변수 조합에 누락 된 값과 중복 값을 제거하고 변수 당 하나 이상의 값이있는 경우 변수 이름을 만듭니다 (b, c 등 추가). 변수 이름 끝에)를 입력 한 다음 데이터 세트를 spread으로 넓은 형식으로 되돌립니다. 새로운 예를 들어

dat = data.frame(email = rep(c("[email protected]", "[email protected]"), each = 2), 
        twitter = c(NA, "user1", NA, "user2"), 
        var1 = c(2, 2, NA, NA), 
        var2 = c(1, NA, 3, NA), 
        var3 = c(NA, NA, 1, 0), 
        var4 = c(0, NA, NA, NA)) 
library(dplyr) 
library(tidyr) 

dat %>% 
    gather(allvar, value, twitter:var4) %>% 
    group_by(email, allvar) %>% 
    filter(!is.na(value) & !duplicated(value)) %>% 
    mutate(allvar2 = paste0(allvar, c("", letters[2:26])[1:n()])) %>% 
    ungroup() %>% 
    select(-allvar) %>% 
    spread(allvar2, value, convert = TRUE) 

Source: local data frame [2 x 7] 

       email twitter var1 var2 var3 var3b var4 
1 [email protected] user1 2 1 NA NA 0 
2 [email protected] user2 NA 3 1  0 NA 

편집 일부 이메일 주소가

누락 항상 트위터 또는 이메일 정보 또는 둘 모두있을 경우 내가 완전히 명확하지 않다 - 그렇다면,이 가능성이 될 수 있다고 생각 @ jazurro의 대답과 같이 na.locf으로 트위터를 작성하고 전자 메일과 트위터를 그룹화 변수로 사용하여 작업을 단순화했습니다.어떤 이메일로 행을 유지하려면

, 당신은 당신이 필요로하는 모든 것을, 그들을 필터링하고, 다시 다음 rbind_list을 할 수있다.이 경우 중복 된 변수의 이름을 지정, 예를 들면, var3var3b는 가능하다 (당신을 위해 운동한다 대신 var3a, var3b으로 이름을 지정하지만이 rbinding 메소드에서는 작동하지 않습니다.

dat = data.frame(email = c(rep(c("[email protected]", "[email protected]"), each = 2), NA), 
        twitter = c(NA, "user1", NA, "user2", "user3"), 
        var1 = c(2, 2, NA, NA, 1), 
        var2 = c(1, NA, 3, NA, 1), 
        var3 = c(NA, NA, 1, 0, 2), 
        var4 = c(0, NA, NA, NA, NA)) 

dat %>% 
    filter(!is.na(email)) %>% # filter out rows with missing email 
    gather(allvar, value, twitter:var4, na.rm=TRUE) %>% 
    group_by(email, allvar) %>% 
    distinct(value) %>% 
    mutate(allvar2 = paste0(allvar, c("", "b")[1:n()])) %>% # Name duplicated variables, ex: var3, var3b 
    # OP gets error using n(); use length(value) instead 
    ungroup() %>% 
    select(-allvar) %>% 
    spread(allvar2, value, convert = TRUE) %>% # Make sure spread converts variables appropriately 
    rbind_list(.,dat[is.na(dat$email),]) # rbind rows with missing email 

Source: local data frame [3 x 7] 

       email twitter var1 var2 var3 var3b var4 
1 [email protected] user1 2 1 NA NA 0 
2 [email protected] user2 NA 3 1  0 NA 
3    NA user3 1 1 2 NA NA 
+0

+1을'tidyr' 솔루션에 제안 할 때 추가했습니다. 나는 아직 나 자신을 시도하지 않았지만, 나는 이것의 모습을 좋아한다. – shadowtalker

+0

답변 해 주셔서 감사합니다. 나는 나의 모범을 더 분명하게했다. 내 데이터로 테스트했지만, 변수 "이메일"과 모든 X를 관찰로 남겨 둡니다. 이유를 찾으려고 노력했습니다. – leakciM

+0

트위터가 혼란 스러울 수도 있습니다. 단지 변수 일뿐입니다. 나는 그 예에서 그것을 편집했다. 코드를 실행하려고합니다. – leakciM

관련 문제