dplyr检查第一次和最后一次永久性更改之间的值

时间:2017-11-17 17:51:20

标签: r dplyr any mutate

我的数据结构如下

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))))

我尝试使用dplyr来创建一个变量,以指示给定的ID是否具有永久性的更改(PERMANENT = 1)或不是(PERMANENT = 0)。我无法使用first()last(),因为这会忽略值之间的值。例如,如果它们从A转到Y并再次回到X,就像A和B的情况一样,对于数据中的每个A和B实例,指标应为0。但是,C从X开始并在所有其他实例中保持为Y.

我尝试在mutate函数中使用索引,但有些东西不起作用。

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永久移动,而A和B在数据集中反弹。

如果运行以下代码,则会出现预期的输出:

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

1 个答案:

答案 0 :(得分:0)

dpylr进行此操作。我假设身份证是永久性的,如果它是第二个观察到的时间段后没有改变。

  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')