我似乎偶然发现了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
,以便拥有一系列交替的START
和END
对(请注意,在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 }}。完成此更改后,以下END
(START
的第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;来完成。
答案 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
(警告可以忽略)