2016-10-28 5 views
0

私はホテルのステイのベクトルを持っています。各行は新しい日を表します。このベクトルには、次のオプションが入力されています: 1.最初の開始 - ホテルに最初に滞在する個人の開始を表します。 2.「NA」 - 個人がホテルにいる時間を表します(滞在の開始または終了はできません)。 ) 3. '終わり' - 個人滞在の終了を表します(滞在の終わりになることができます。はい、個人は複数回滞在できます)。 'another start' - 後の滞在の開始を表します。最初の滞在は2番目または3番目または4番目になることができます(一部の人は同じホテルを10回以上訪問します) 5.最初の出発の終わり - 最初の滞在のために1日だけ滞在する人を表します 6. 'another開始の終わり ' - 最初ではない滞在のために1日だけ滞在する人を表します。以前の値に基づいてベクトルを書き下し、以前の値に基づいて将来の値を変更する

私は個人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

'AVE(持って、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()) 
関連する問題