2017-12-07 9 views
1

각 회사의 활성 상태를 나열하는 변수가 있습니다. 어떤 종류의 지역 (서쪽, 남쪽, 중서부 등)을 만들 수 있기를 바라고 있습니다. 변하기 쉬운. 이 경우 각 회사가 둘 이상의 지역에있을 수 있습니다.상태 목록에서 지역 표시기 변수를 만드는 방법 R

내 접근 방식은 지역 벡터를 정의한 다음 표시기 변수 (dat $ westYN, dat $ southYN 등)를 해당 지역의 상태에서 작동하는 경우 1로, 그렇지 않으면 0으로 정의하려고했습니다.

str_split을 사용하여 상태 문자열을 분리했지만 결과 목록을 사용하는 방법에 어려움을 겪고 있습니다.

이 경우 dat $ state는 단일 값이지만 여러 상태가있을 때는 작동하지 않습니다.

도움이 될 것입니다. 먼저

id <- 1:20 
state <- c("NJ, NY", 
     "ID, OR", 
     "CA", 
     "FL, MO, NC, RI", 
     "TX DE, KY, MD, MA, NH, NJ, PA, RI, WV", 
     "FL, KY, TN", 
     "DC, MD, VA", 
     "NY", 
     "AZ, NM", 
     "FL, NJ, NY", 
     "IN, MI", 
     "GA, SC", 
     "NV", 
     "AR, CO, KY, MO, TN, TX", 
     "OH", 
     "NC", 
     "FL", 
     "IL", 
     "AZ", 
     "CA, CT, IL, MA, OH, PA, UT, WV" 
     ) 

dat <- data.frame(id, state) 

west <- c("WA", "OR", "CA", "NV", "AZ", "ID", "MT", "WY", 
     "CO", "NM", "UT") 
south <- c("TX", "OK", "AR", "LA", "MS", "AL", "TN", "KY", 
     "GA", "FL", "SC", "NC", "VA", "WV") 
midwest <- c("KS", "NE", "SD", "ND", "MN", "MO", "IA", "IL", 
     "IN", "MI", "WI", "OH") 
northeast <- c("ME", "NH", "NY", "MA", "RI", "VT", "PA", 
      "NJ", "CT", "DE", "MD", "DC") 

stateList <- stringr::str_split(dat$state, ",") 

dat$westYN <- ifelse(is.element(stateList, west), 1, 0) 
dat$southYN <- ifelse(is.element(stateList, south), 1, 0) 
dat$midwestYN <- ifelse(is.element(stateList, midwest), 1, 0) 
dat$northeastYN <- ifelse(is.element(stateList, northeast), 1, 0) 

답변

2

, 나는 당신이보다 쉽게 ​​변수를 생성하기 위해 루프를 할 수

다음
regions <- list(
    west = c("WA", "OR", "CA", "NV", "AZ", "ID", "MT", "WY", 
      "CO", "NM", "UT"), 
    south = c("TX", "OK", "AR", "LA", "MS", "AL", "TN", "KY", 
      "GA", "FL", "SC", "NC", "VA", "WV"), 
    midwest = c("KS", "NE", "SD", "ND", "MN", "MO", "IA", "IL", 
      "IN", "MI", "WI", "OH"), 
    northeast = c("ME", "NH", "NY", "MA", "RI", "VT", "PA", 
       "NJ", "CT", "DE", "MD", "DC") 
) 

별도의 변수보다는 목록에서 관련 정보를 저장하는 것이 더 낫다 생각

for(region in names(regions)) { 
    dat[[paste0(region, "YN")]] <-sapply(stateList, function(x) any(trimws(x) %in% regions[[region]])) 
} 

또는 일반 vairables 사용

dat$westYN <- sapply(stateList, function(x) any(x %in% west)) 
dat$southYN <- sapply(stateList, function(x) any(x %in% south)) 
dat$midwestYN <- sapply(stateList, function(x) any(x %in% midwest)) 
dat$northeastYN <- sapply(stateList, function(x) any(x %in% northeast)) 

트릭은 any()을 사용하여 값이 각 지역의 상태 중 하나와 일치하는지 확인하는 것입니다.

+0

추천 해 주셔서 감사합니다. 코드를 실행할 때 여러 영역의 상태가있는 행이 올바른 결과를 산출하지 못하는 것으로 나타났습니다. 예를 들어 id 20은 모든 지역에 대해 true 일 때 서쪽 만 사실입니다. 게다가 id 5는 전반적으로 틀린가? 이 문제를 해결하는 방법에 대한 아이디어가 있습니까? –

+0

@EmmaKortemeier @MrFlick 여전히 공백을 잘라야합니다. 이것은'any (x)'대신'any (trimws (x)')를 써서 할 수 있습니다. 응답에 대한 개정안을 제출했으나 아직 peer review가 보류 중입니다 – jmuhlenkamp

+0

@jmuhlenkamp 그것을 해결! 고마워요! –