错误:在 dplyr 中变异时大小不兼容

Ale*_*der 5 r dplyr

我在使用 dplyr 中的函数时遇到问题mutate,错误提示:

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

之前有一些帖子,我尝试了一些解决方案,但我的案例没有运气。

具有多个因素错误不兼容大小 0-expe 的组阶乘数据

r-dplyr-使用-mutate-with-na-omit-导致错误-不兼容-大小-d

结果长度不等于 1 或 dp 组长度的分组操作

这是我尝试过的,

ff <- c(seq(0,0.2,0.1),seq(0,-0.2,-0.1))
flip <- c(c(0,0,1,1,1,1),c(1,1,0,0,0,0))
df <- data.frame(ff,flip,group=gl(2,6)) 

> df
     ff flip group
1   0.0    0     1
2   0.1    0     1
3   0.2    1     1
4   0.0    1     1
5  -0.1    1     1
6  -0.2    1     1
7   0.0    1     2
8   0.1    1     2
9   0.2    0     2
10  0.0    0     2
11 -0.1    0     2
12 -0.2    0     2
Run Code Online (Sandbox Code Playgroud)

我想根据以下条件添加名为c1和的新组c2

 dff <- df%>%
      group_by(group)%>%
      mutate(flip=as.numeric(flip),direc=ifelse(c(0,diff(ff))<0,"backward","forward"))%>%
      spread(direc,flip)%>%
      arrange(group,group)%>%
      mutate(c1=ff[head(which(forward>0),1)],c2=ff[tail(which(backward>0),1)])
Run Code Online (Sandbox Code Playgroud)

错误:大小不兼容 (0),预期为 5(组大小)或 1

我也添加do并尝试过

do(data.frame(., c1=ff[head(which(.$forward>0),1)],c2=ff[tail(which(.$backward>0),1)]))
Run Code Online (Sandbox Code Playgroud)

data.frame(., c1 = ff[head(which(.$forward > 0), 1)], c2 = ff[tail(which(.$backward > : 参数暗示不同的行数: 5, 1 , 0

但当我只mutate c1写专栏时,一切似乎都正常。为什么?

Ara*_*s7d 3

只是扩展@allistaire 的评论。

  1. 您指定的条件是错误的原因。具体来说,tail(which(backward>0),1)
  2. 可以优化给定的代码以消除spread()

你可以试试

dff <- df%>%
  group_by(group)%>%
  mutate(flip=as.numeric(flip),direc=ifelse(c(0,diff(ff))<0,"backward","forward"))%>%
  arrange(group)%>%
  mutate(c1=ff[head(which(direc=="forward" & flip > 0),1)])
Run Code Online (Sandbox Code Playgroud)

看来您正在寻找确定direction每个变化的流入点group。在这种情况下,请准确说明翻转是如何相关的,或者如果您更改flip <- c(c(0,0,1,1,1,1),c(1,1,0,0,0,0))flip <- c(c(0,0,1,1,1,1),c(1,1,0,1,1,1))以便flip标记沿 的方向变化ff,您可以使用

dff <- df%>%
  group_by(group)%>%
  mutate(flip=as.numeric(flip),direc=ifelse(c(0,diff(ff))<0,"backward","forward"))%>%
  arrange(group)%>%
  mutate(c1=ff[head(which(direc=="forward" & flip > 0),1)]) %>%
  mutate(c2=ff[tail(which(direc=="backward"& flip >0),1)])
Run Code Online (Sandbox Code Playgroud)

这使:

Source: local data frame [12 x 6]
Groups: group [2]

      ff  flip  group    direc    c1    c2
   <dbl> <dbl> <fctr>    <chr> <dbl> <dbl>
1    0.0     0      1  forward   0.2  -0.2
2    0.1     0      1  forward   0.2  -0.2
3    0.2     1      1  forward   0.2  -0.2
4    0.0     1      1 backward   0.2  -0.2
5   -0.1     1      1 backward   0.2  -0.2
6   -0.2     1      1 backward   0.2  -0.2
7    0.0     1      2  forward   0.0  -0.2
8    0.1     1      2  forward   0.0  -0.2
9    0.2     0      2  forward   0.0  -0.2
10   0.0     1      2 backward   0.0  -0.2
11  -0.1     1      2 backward   0.0  -0.2
12  -0.2     1      2 backward   0.0  -0.2
Run Code Online (Sandbox Code Playgroud)