2016-10-28 1 views
0

호텔 숙박 정보가 있습니다. 각 행은 새로운 날을 나타냅니다. 벡터는 다음 옵션으로 채워집니다 : 1. 'first start'- 호텔에 처음 머물기 시작하는 사람을 나타냅니다. 2. 'NA'- 개인이 호텔에 머무르는 시간을 나타냅니다 (체류를 시작하거나 종료 할 수 없음).) 3. 'end'- 개인 체류의 끝을 나타냅니다 (숙박 기간이 끝날 수도 있음). 예. 개인은 여러 번 체류 할 수 있습니다. 4. 'another start'- 첫 번째 숙박은 두 번째 또는 세 번째 또는 네 번째 등이 될 수 있습니다 (어떤 사람들은 같은 호텔을 10 회 이상 방문합니다). 5. '첫 번째 출발 종료'- 첫 번째 숙박 일로 하루 만 남았습니다. 6. '다른 시작 끝 '- 첫 번째가 아닌 체류를 위해 하루 만 체류하는 사람을 나타냅니다.이전 값을 기준으로 벡터를 채우고 이전 값을 기반으로 미래 값을 변경하십시오.

나는 또한 사람 ID 변수가 있습니다.

Here

내가 가지고있는 샘플 내가

 Person_ID Have    Want 
[1,] "1"  "first start"  "1" 
[2,] "1"  "NA"    "1" 
[3,] "1"  "NA"    "1" 
[4,] "1"  "end"    "1" 
[5,] "1"  "another start"  "2" 
[6,] "1"  "NA"    "2" 
[7,] "1"  "NA"    "2" 
[8,] "1"  "NA"    "2" 
[9,] "1"  "end"    "2" 
[10,] "1"  "another start"  "3" 
[11,] "1"  "NA"    "3" 
[12,] "1"  "end"    "3" 
[13,] "1"  "another start"  "4" 
[14,] "1"  "NA"    "4" 
[15,] "1"  "end"    "4" 
[16,] "1"  "another start end" "5" 
[17,] "1"  "another start"  "6" 
[18,] "1"  "NA"    "6" 
[19,] "1"  "end"    "6" 
[20,] "1"  "another start end" "7" 
[21,] "1"  "another start end" "8" 
[22,] "2"  "first start"  "1" 
[23,] "2"  "NA"    "1" 
[24,] "2"  "end"    "1" 
[25,] "3"  "first start end" "1" 
[26,] "3"  "another start"  "2" 
[27,] "3"  "NA"    "2" 
[28,] "3"  "end"    "2" 
[29,] "4"  "first start end" "1" 
[30,] "4"  "another start end" "2" 
[31,] "4"  "another start"  "3" 
[32,] "4"  "NA"    "3" 
[33,] "4"  "end"    "3" 

내가 루프를 사용하여 시도하고 싶지만, 내 파일이 50 행 긴 ~ 무엇과 효율적인 들어, 자동으로 실행하기 위해 어떤 제안을 너무 오래 걸려서 이것을하는 방법은 매우 감사하게 될 것입니다! 감사!

+0

은'아베보십시오 ("시작"(한 person_id로, FUN = 기능 (X) cumsum (grepl을 X)))'. – nicola

답변

0

tidyverse 패키지를 사용할 수 있습니다. 당신이 당신의 데이터를 포함 df라고 명명 된 매트릭스가 가정 :

library(tidyverse) 

result <- df %>% 
    as_tibble() %>% 
    mutate_at("Have", funs(if_else(. %in% c("end", "NA"), NA_character_, .))) %>% 
    fill(Have) %>% 
    group_by(Person_ID) %>% 
    mutate(Want = as.factor(Have) %>% forcats::fct_inorder() %>% as.numeric()) 
관련 문제