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

时间:2017-01-16 08:04:51

标签: r dplyr

我在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&gt; 0),1)],c2 = ff [tail(其中。$ $&gt;:     参数意味着不同的行数:5,1,0

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

2 个答案:

答案 0 :(得分:3)

通过管道查看发生的情况可能会提供信息。

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

BTW:为什么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上进行有意义的索引,您需要在退货中使用integer(0)以外的其他内容。

答案 1 :(得分:3)

只是扩展@ allistaire的评论。

  1. 您指定的条件是导致错误的原因。具体而言,tail(which(backward>0),1)
  2. 可以优化代码以摆脱spread()
  3. 你可以尝试

    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的方向发生变化,则可以使用< / p>

    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