2017-12-15 29 views
1

각 확인란이 표시기 변수 인 설문 조사에서 매우 지저분한 데이터 집합이 있습니다. 따라서 M/F를 항목으로하여 성별 (또는 인종)을 변수로 사용하는 대신 gender_m과 지표가있는 gender_f 열이 있습니다.열 이름을 변수로 정리하기

간체 예 :

df <- tribble(
    ~id, ~gender_m, ~gender_f, 
    #--|----------|--------- 
    1L , 0  , 1, 
    2L , 1  , 0, 
    3L , 0  , 0, 
    4L , 1  , 1 
) 

내가 출력으로 원하는 것은 :

는 하드 코드 것들을 충분히 쉽게 만 2 열이있는 성 같은 것을 들어

,하지만 난 인종 (또는 사용하는 프로그래밍 언어)과 같은 것들이 여러 가능성을 가지고 있기 때문에 가능한 한 포괄적 인 것으로 만들기 위해 노력합니다.

나는 거의 1000 개의 열을 가지고 있지만 실제 변수는 20 개 미만입니다. 모든 열은 <variable_name>_<potential_value> 형식입니다.

나는이 일을하는 깔끔한 기능을 놓치고 있다고 확신하지만, 내 googlefu는 약해 보인다.

+0

'누락'과 '1 개 이상을 선택했습니다.'라는 말이 꽤 특화되어 있습니다. 존재하는 기능을 찾지 못했다고 생각하지 않습니다. – Gregor

답변

5

tidy 기능의 많은 행보다 열에 더 잘 작동, 그래서 당신은 오래로 변환하는 경우이 조금 쉬워집니다 :

당신이 0/1 지표의 이러한 종류의 많은 항목이있는 경우
df_long = df %>% 
    gather(Item, Response, starts_with("gender")) 

cleaned = df_long %>% 
    mutate(Item = str_match(Item, "(.*)_(.*)")[, 3]) %>% 
    group_by(id) %>% 
    summarize(RespCleaned = case_when(
     sum(Response) == 0 ~ "Missing", 
     sum(Response) == 1 ~ Item[Response == 1][1], 
     sum(Response) > 1 ~ "More than 1 selected" 
    )) 

df = df %>% left_join(cleaned, by = "id") 

응답의 경우, 응답의 합계를 사용하면 2 개 이상의 옵션이있는 항목으로 일반화해야합니다. starts_with("gender")을 관련 선택란을 선택하는 것보다 다른 선택기로 바꾸면됩니다.

1

다음은 기본 접근 방식입니다 (stringr 제외). 비슷한 경우를 잘 일반화하고 기능을 쉽게 구현해야합니다. 있는 그대로, 1000 개의 열에서 20 개의 변수로 전체 데이터 프레임에서 작동 할 수 있습니다.

library(stringr) 
sep = "_" 
vars = unique(na.omit(str_extract(names(df), ".*(?=_)"))) 

for (i in seq_along(vars)) { 
    these_vars = names(df)[str_detect(names(df), paste0("^", vars[i]))] 
    result = character(nrow(df)) 
    rs = rowSums(df[these_vars]) 
    result[rs == 0] = "mising" 
    result[rs > 1] = "more than 1 selected" 
    result[rs == 1] = these_vars[apply(df[rs == 1, these_vars] == 1, 1, which)] 
    df[i] = result 
} 

df 
# # A tibble: 4 x 4 
#  id gender_m gender_f    gender 
# <int> <dbl> <dbl>    <chr> 
# 1  1  0  1    gender_f 
# 2  2  1  0    gender_m 
# 3  3  0  0    mising 
# 4  4  1  1 more than 1 selected