我的数据结构如下
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)
答案 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')