提问者:小点点

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


我在dplyr中的mutate函数遇到问题,错误显示;

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

有一些历史发文,我尝试了一些解决方案,但没有运气。

group-factorial-data-with-多因素-错误-不兼容-size-0-exp e

r-d plus r-使用-mutate-with-na-省略-原因-错误-不兼容-大小-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

我想根据以下一些条件添加名为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(其中(.$前进

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


共2个答案

匿名用户

只是扩展@allistaire的评论。

  1. 您指定的条件是错误的原因。具体来说,尾巴(向后

你可以试试

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

似乎您正在寻找为每个确定方向更改的流入点。在这种情况下,请明确翻转是如何相关的,或者如果您更改了翻转

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

匿名用户

穿过管道看看发生了什么可能会有所帮助。

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:为什么排列(group, group)?将顺序变量加倍是没有意义的。

看这里,你会发现你有(1)向后不大于0的值。当你运行像that(FALSE)这样的东西时,你会得到integer(0)。这可能是一个很好的时机来意识到dplyr需要rhs的向量长度与组中的行数相同。

我将通过轻微的修改来显示它:返回中返回的唯一值的数量,调用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)以外的东西。