首页 文章

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

提问于
浏览
2

我在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)])

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

我还添加 do 并尝试过

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

data.frame中的错误( . ,c1 = ff [head(其中 . $ forward> 0),1)],c2 = ff [tail(其中 . $ back>:参数意味着行数不同:5, 1,0

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

2 回答

  • 2

    只是扩展@ 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)])
    

    看起来你正在寻找每个 groupdirection 变化的流入点 . 在这种情况下,请详细说明翻转是如何相关的,或者如果您将 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
    
  • 2

    通过管道查看正在发生的事情可能是有益的 .

    df %>%
      group_by(group)%>%
      mutate(flip=as.numeric(flip),direc=ifelse(c(0,diff(ff))<0,"backward","forward"))%>%
      spread(direc,flip)%>%
      arrange(group,group)
    # Source: local data frame [10 x 4]
    # Groups: group [2]
    #       ff  group backward forward
    #    <dbl> <fctr>    <dbl>   <dbl>
    # 1   -0.2      1        1      NA
    # 2   -0.1      1        1      NA
    # 3    0.0      1        1       0
    # 4    0.1      1       NA       0
    # 5    0.2      1       NA       1
    # 6   -0.2      2        0      NA
    # 7   -0.1      2        0      NA
    # 8    0.0      2        0       1
    # 9    0.1      2       NA       1
    # 10   0.2      2       NA       0
    

    顺便说一句:为什么 arrange(group,group) ?加倍订单变量毫无意义 .

    看这里,你会看到你有(1) backward 的值不大于0.当你运行像 which(FALSE) 这样的东西时,你会得到 integer(0) . 这可能是认识到 dplyr 需要rhs的向量长度与组中行数相同的长度的好时机 .

    而不是 mutate ,我会稍微修改一下:返回 which 调用 c2 中返回的唯一值的数量:

    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)],
        c2len = length(which(backward > 0))
      )
    # Source: local data frame [10 x 6]
    # Groups: group [2]
    #       ff  group backward forward    c1 c2len
    #    <dbl> <fctr>    <dbl>   <dbl> <dbl> <int>
    # 1   -0.2      1        1      NA   0.2     3
    # 2   -0.1      1        1      NA   0.2     3
    # 3    0.0      1        1       0   0.2     3
    # 4    0.1      1       NA       0   0.2     3
    # 5    0.2      1       NA       1   0.2     3
    # 6   -0.2      2        0      NA   0.0     0
    # 7   -0.1      2        0      NA   0.0     0
    # 8    0.0      2        0       1   0.0     0
    # 9    0.1      2       NA       1   0.0     0
    # 10   0.2      2       NA       0   0.0     0
    

    为了在 ff 上有意义地索引,您需要在回报中使用_1008546以外的其他内容 .

相关问题