Lag没有看到mutate对前一行的影响

时间:2016-03-17 10:49:04

标签: r dplyr

我似乎偶然发现了mutate/lag/ifelse我无法解释的行为。我有以下(简化)数据框:

test <- data.frame(type = c("START", "END", "START", "START", "START", "START", "END"),
                   stringsAsFactors = FALSE)

> test

  type
1 START
2   END
3 START
4 START
5 START
6 START
7 START
8   END

我想修改列type,以便拥有一系列交替的STARTEND对(请注意,在test数据框中只有START序列{1}}是可能的,END永远不会重复):

> desired

  type
1 START
2   END
3 START
4   END
5 START
6   END
7 START
8   END

我认为我可以使用以下代码实现我的目标:

test %>%
 mutate(type = ifelse( type == "START" &
                       dplyr::lag(type, n=1, default="END") == "START" &
                       dplyr::lead(type, n=1, default="END") == "START", "END" , type))

代码应检测START前面有START后跟START的行,在这种情况下,type值更改为{{1 }}。完成此更改后,以下ENDSTART的第5行)不应匹配,因为其先前的test值现在为type。不幸的是,该命令的输出如下:

END

type 1 START 2 END 3 START 4 END 5 END 6 END 7 START 8 END 看到的值不受mutate的影响。这是它应该如何工作?有没有办法以lag看到lag对前一行的影响的方式对其进行编码?

版本:R版本3.2.3(2015-12-10),dplyr_0.4.3

更新:Paul Rougieux在下面解释了上述代码无法工作的原因:引导和滞后是固定的,不考虑进一步的修改。所以我猜正确的答案是&#34;它不能直接使用dplyr&#34;来完成。

2 个答案:

答案 0 :(得分:1)

mutate()中单独定义滞后和潜在变量会显示您对ifelse(type == "START" & lag == "START" & lead == "START", "END" , type)的调用不起作用:

test <- data.frame(type = c("START", "END", "START", "START", "START", "START", "END"), stringsAsFactors = FALSE)
test %>%
    mutate(lag = dplyr::lag(type, n=1, default="END"),
           lead = dplyr::lead(type, n=1, default="END"),
           type2 = ifelse(type == "START" & lag == "START" & lead == "START",
                          "END" , type))

#   type   lag  lead type2
#1 START   END   END START
#2   END START START   END
#3 START   END START START
#4 START START START   END
#5 START START START   END
#6 START START   END START
#7   END START   END   END

dplyr::mutate()修改了整个矢量。超前和滞后是固定的,不考虑对type向量的进一步修改。在这种情况下,你想要的是一个`Reduce()函数。检查帮助(减少)。

答案 1 :(得分:0)

这个怎么样?

 test$type[test$type != c("START", "END")] <- 
 ifelse(test$type[test$type != c("START", "END")] == "START", "END", "START")

test
   type
1 START
2   END
3 START
4   END
5 START
6   END
7 START

(警告可以忽略)