我在 dplyr 中的 mutate 函数有问题,错误说;

Error: incompatible size (0), expecting 5 (the group size) or 1

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

group-factorial-data-with-multiple-factors-error-incompatible-size-0-expe

r-dplyr-using-mutate-with-na-omit-causes-error-incompatible-size-d

grouped-operations-that-result-in-length-not-equal-to-1-or-length-of-group-in-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

我想根据一些条件添加名为 c1c2 的新组,如下所示
 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)])



我还添加了 do 并尝试过
do(data.frame(., c1=ff[head(which(.$forward>0),1)],c2=ff[tail(which(.$backward>0),1)]))



但是当我只有 mutate c1 列时,一切似乎都在工作。为什么?

最佳答案

只是扩展@allistaire 的评论。

  • 您指定的条件是错误的原因。具体来说,tail(which(backward>0),1)
  • 可以优化给定的代码以摆脱 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)])
    

    对于每个 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)])
    

    这使:
    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
    

    关于r - 错误 : incompatible size when mutating in dplyr,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41671856/

    10-12 19:57