【发布时间】:2017-11-17 17:51:19
【问题描述】:
我有这样的数据结构
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 和 B 的情况一样从 X 到 Y 再回到 X,则对于数据中的每个 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)
【问题讨论】:
-
你能显示预期的输出吗?你需要
data %>% arrange(ID, TIME) %>% group_by(ID) %>% mutate(PERMANENT = as.integer(n_distinct(data.table::rleid(LOC == "X"))<=2)) %>% as.data.frame -
如何判断更改是否是永久性的?即 A 在最后 4 个观察到的时间段内停留在 X 上。这不是永久性的吗?
-
有错别字,
-1]后面的括号应该在0)后面这样:& any(LOC[2:length(ID)-1] != "X"),1,0)) -
Aurele 的回答解决了 ifelse 语句的语法,但输出应该显示只有 C 是永久转移。