在dplyr mutate中使用"diff"函数时出错

Ale*_*der 4 r difference dplyr

我尝试将mutate新列添加到data.frame.当V列顺序从递减顺序变为递增顺序时,我使用其中的diff函数mutate将它们分类到新列中H.

V <- c(seq(30,-10,-10),seq(-10,30,10))
gr = rep(seq(1,3),each=10)
df <- data.frame(V,gr)

library(dplyr)    
diff_df <- df%>%
  group_by(gr)%>%
  mutate(H=ifelse(diff(V)<0,"back","forward"))
Run Code Online (Sandbox Code Playgroud)

但是得到错误

Error: incompatible size (9), expecting 10 (the group size) or 1
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做

DIFF(DF $ V)

[1] -10 -10 -10 -10 0 10 10 10 10 0 -10 -10 -10 -10 0 10 10 10 10 0 -10 -10 -10 -10 0 10 10 10 10

似乎在逻辑上有效.当我在里面做的时候为什么我会收到错误dplyr?

akr*_*run 5

我们需要连接另一个值以使长度等于diff返回,其长度小于组的长度.即

length(df$V)
#[1] 30
length(diff(df$V))
#[1] 29
Run Code Online (Sandbox Code Playgroud)

因此,我们在开头用一个虚拟数字连接以使其length相等.

 df %>%
   group_by(gr) %>%
   mutate(H=ifelse(c(0,diff(V))<0,"back","forward"))
Run Code Online (Sandbox Code Playgroud)

如果我们需要第一个值为"返回",请将条件更改为 <=0

  • 更多`dplyr`-y替代方案是用`V - lag(V)`替换`diff`.(或者也许是"V - 滞后(V,1,0)") (6认同)
  • @jhilliar `mutate_each` 很快就会被替换。`df %&gt;% group_by(gr) %&gt;% mutate_all(funs(ifelse(c(0, diff(.)) &lt; 0, "back", "forward")))` (2认同)