2016-07-13 2 views
-1

Я пытаюсь создать разницу в 7 дней по группе. Итак, я пытаюсь воспроизвести приведенный ниже код и надеюсь получить аналогичный результат с 7-дневным отставанием.различие по группе с dplyr mutate

library(dplyr) 

dat %>% mutate(dx=c(NA, diff(x)), dy=c(NA, diff(y))) 

    x y dx dy 
1 5 3 NA NA 
2 8 9 3 6 
3 3 1 -5 -8 
4 1 5 -2 4 

Но я получаю сообщение об ошибке:

Error: incompatible size (900), expecting 905 (the group size) or 1

есть быстрый и простой способ исправить эту ошибку. Я полагаю, что это может иметь отношение к мутату.

+0

Пожалуйста, покажите свой пример ввода. На основе вывода нет 'colname1, colname2' – akrun

+0

. Пожалуйста, прочитайте информацию о [как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask) и как дать [ воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610). Это облегчит вам помощь другим людям. – Jaap

+0

благодарит за комментарий. Единственное различие между моим кодом и выше - group_by. so dat%>% group_by (ничего)%>% mutate (dx = c (NA, diff (x)), dy = c (NA, diff (y))). Я знаю, что это простое решение, я просто не знаю, как это исправить, так как я довольно новичок в r. –

ответ

3

Вам нужно заполнить NA количеством дней в вашей задержке. Так же, как вам нужно 1 NA для прокладки для отсутствия значения разницы для первой строки с запаздыванием 1, теперь вам нужно 7 NA для прокладки из-за отсутствия значения разницы для первых 7 строк. Пример со встроенной рамой mtcars данных:

mtcars %>% 
    mutate(dx = c(NA, diff(mpg)), 
     dx7 = c(rep(NA,7), diff(mpg, 7))) 

Или с группировкой:

mtcars %>% 
    group_by(am) %>% 
    mutate(dx = c(NA, diff(mpg)), 
     dx7 = c(rep(NA,7), diff(mpg, 7))) 

@ хороший ответ лесоруба напомнил мне, что вы также можете использовать версию zoo ПАКЕТА по diff, который имеет встроенную обивка. Вы просто должны преобразовать вектор в zoo объекта, так что метод diff.zoo получит послан, вместо базового R diff, что делает na.pad доступны:

library(zoo) 

mtcars %>% 
    mutate(dx = diff(zoo(mpg), na.pad=TRUE), 
     dx7 = diff(zoo(mpg), 7, na.pad=TRUE)) 
+0

О, черт! Спасибо большое. Это сработало! –

1

Я хотел бы предложить, чтобы избавиться от diff вообще, и использовать dplyr s очень собственный lag. Это позаботится о необходимых NA.

mtcars %>% 
    mutate(dx = mpg - lag(mpg), 
     dx7 = mpg - lag(mpg, 7)) 
+1

Ну, вы выигрываете в кодовом гольф! – eipi10

+1

Ну, я узнал немало из ваших ответов в прошлом году или около того. – Axeman

+1

Спасибо! Это приятно знать. – eipi10

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