2017-11-17 1 views
0

나는이dplyr 체크 값

set.seed(2) 
require(tidyverse) 

data <- data.frame("TIME" = c(sample(seq(1:20), 20, replace = F), seq(21:30)), 
        "ID" = c(rep("A", 10), rep("B", 10), rep("C", 10)), 
        "LOC" = c(sample(c("X", "Y"), 20, replace = T), c("X", rep("Y", 9)))) 

처럼 구조화 된 데이터를하고 난 주어진 ID는 시간에 변화가 있는지 여부를 표시하는 변수를 만들 dplyr 사용하려고 해요 영구적 (PERMANENT = 1) 또는 그렇지 않은 (PERMANENT = 0). first() 또는 last()은 between between values를 무시하기 때문에 사용할 수 없습니다. 예를 들어 A와 B의 경우와 같이 X에서 Y로 이동하고 다시 X로 돌아 가면 데이터의 A와 B의 모든 인스턴스에 대해 표시기가 0이어야합니다. 그러나 C는 X에서 시작하여 다른 모든 경우 Y에 머물러 있습니다.

mutate 함수에서 인덱싱을 사용하려고했지만 무언가가 작동하지 않습니다. 말했듯이 A와 B의 데이터 세트의 주위 반송하면서

data %>% 
    arrange(ID, TIME) %>% 
    group_by(ID)%>% 
    mutate(LOC = as.character(LOC), 
     PERMANENT = ifelse(last(LOC) != "X" & any(LOC[2:length(ID) -1]) != "X"), 1, 0) 

는 C를 나타내야 출력이 완전히 이동.

data$PERMANENT<-ifelse(data$ID%in%c("A","B"),0,1) 
+0

예상되는 출력을 표시 할 수 있습니까? % mutation (영구 = as.integer (n_distinct (data.table :: rleid (LOC == "X")) <=2)) %> % 데이터 정렬 % (ID, TIME) %> % group_by (ID) % as.data.frame' – akrun

+0

변경 사항이 영구적인지 여부를 어떻게 알 수 있습니까? 즉, 최근 4 개의 관측 기간 동안 X에 머무르면 영구적 인 것으로 간주되지 않습니까? – TBT8

+1

'-1 '다음에 괄호가 오타가 있습니다. '& any (LOC [2 : 길이 (ID) -1]! = "X"), 1,0))' –

답변

0

여기 dpylr와 그것에서 이동이있다 :

예상 출력은 다음과 같은 코드를 실행하면 어떻게 것입니다. 두 번째 관찰 기간 이후로 변경되지 않은 경우 ID가 영구적이라고 가정합니다.

set.seed(2) 
    data<-data.frame("TIME" = c(sample(seq(1:20),20,replace = F),seq(21:30)),"ID" =c(rep("A",10),rep("B",10),rep("C",10)),"LOC" = c(sample(c("X","Y"),20,replace = T),c("X",rep("Y",9)))) 


    data %>% arrange(ID, TIME) %>% 
     group_by(ID) %>% 
     mutate(timeObs = row_number(), SecondLoc = LOC[timeObs == 2], Change = LOC != SecondLoc) %>% 
     filter(timeObs > 1) %>% 
     summarize(Permanent = sum(Change) == 0) %>% 
     right_join(data, by = 'ID')