2017-01-16 1 views
1

У меня есть проблема с функцией mutate в dplyr, и ошибка говорит;Ошибка: несовместимый размер при мутировании в dplyr

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 

Я хочу, чтобы добавить новую группу под названием 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)]) 

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

Я также добавить do и попытался

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

Error in data.frame(., c1 = ff[head(which(.$forward > 0), 1)], c2 = ff[tail(which(.$backward > : arguments imply differing number of rows: 5, 1, 0

, но когда я только mutatec1 колонка все, кажется, работает. Зачем?

+4

последний строка должна быть 'mutate (c1 = head (ff [forward> 0], 1), c2 = tail (ff [назад> 0], 1))' (Оба дают NA, хотя в этом примере) – Sotos

+1

Нет значения в группа 2, для которой «назад» больше 0. – alistaire

+0

@alistaire Даже нет никакой ценности, я смогу получить хотя бы NA v для пустых строк? – Alexander

ответ

2

Просто расширяется комментарий @ 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)]) 

Похоже, вы хотите, чтобы определить точки наплыва где это 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 
+0

спасибо за ваш ответ. Но кажется, что ваше решение не работает на моем реальном df. Флип-порядок очень важен и его нельзя менять. Когда вы переходите на 'flip <- c (c (0,0,1,1,1,1), c (1,1,0,1,1,1)), вы меняете фрейм данных. – Alexander

+0

Почему вы меняете столбец 'flip'? Его нельзя изменять, и я все еще получаю ошибку, так как я не могу изменить порядок «flip» в моем read df. – Alexander

+0

Я только изменил его в качестве примера. вам нужно понять причину ошибки здесь, то есть для 'c2',' directc == "backward" & flip> 0' не удовлетворяет обеим группам в примере, а возвращаемый возвращаемый вектор имеет длину, отличную от количество групп. – Aramis7d

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, что вам нужно что-то иное, чем integer(0) в ваших возвратах.

+0

Прошу прощения, похоже, нет выхода для c2? я прав? – Alexander

+0

Точка эффективно alistaire's, но я не предполагал, что это была ваша логика. Мой ответ строго отвечает на вопрос «Почему», предполагая, что вы можете исправить ошибочную логику. – r2evans

+0

(Исправление, точка была точкой @Sotos). Обычное упущение в вопросах SO (намечено в [SO help] (http://stackoverflow.com/help/mcve) в разделе «Подтверждаемый»), чтобы предоставить образец ожидаемого результата. Иногда это может быть так же просто, как создание статического data.frame со значениями, которые вы ожидаете, или, по крайней мере, то, как они будут выглядеть. Особенно со сложными структурами ввода, это почти всегда приносит пользу всем, если вопрос задается с небольшими и репрезентативными данными; и в этом случае часто намного легче диктовать, каков должен быть выход. – r2evans

 Смежные вопросы

  • Нет связанных вопросов^_^