【问题标题】:dplyr check values between first and last permanent changedplyr 检查第一个和最后一个永久更改之间的值
【发布时间】: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 %&gt;% arrange(ID, TIME) %&gt;% group_by(ID) %&gt;% mutate(PERMANENT = as.integer(n_distinct(data.table::rleid(LOC == "X"))&lt;=2)) %&gt;% as.data.frame
  • 如何判断更改是否是永久性的?即 A 在最后 4 个观察到的时间段内停留在 X 上。这不是永久性的吗?
  • 有错别字,-1] 后面的括号应该在0) 后面这样:&amp; any(LOC[2:length(ID)-1] != "X"),1,0))
  • Aurele 的回答解决了 ifelse 语句的语法,但输出应该显示只有 C 是永久转移。

标签: r any dplyr


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2017-09-24
    相关资源
    最近更新 更多