Найти разницу между ячейками в одном столбце, которые соответствуют определенным критериям - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть датафрейм ниже:

name<-c("ab","ab","ab","ac","ac","ac","d","d","d")
value<-c(9,9,6,10,10,4,8,9,8)
week<-c(31,31,32,31,31,35,32,33,35)
c<-data.frame(name,value,week)

Я хотел бы создать новый столбец с разницей между значением недели для каждого name, если существует предыдущий week. Если нет 0 будет отображаться. Для приведенного ниже кадра данных ответ будет следующим:

       name value week df
    1   ab     9   31  0
    2   ab     9   31  0
    3   ab     6   32 -3
    4   ac    10   31  0
    5   ac    10   31  0
    6   ac     4   35  0
    7    d     8   32  0
    8    d     9   33  1
    9    d     8   35  0

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Именование вашего data.frame df и вашего нового столбца diff, вот один из способов сделать это с data.table:

library(data.table)
setDT(df)

df[ , diff := ifelse(week-shift(week)==1, value-shift(value), 0), by=name]
df[is.na(diff), diff := 0]
0 голосов
/ 11 сентября 2018

data.table с использованием соединения с временным набором, перемещающим неделю вперед на один шаг:

library(data.table)
dat <- as.data.table(c)


dat[
  unique(dat[,c(.SD,.(week1=week+1))]),
  on=c("name","week"="week1"),
  dfr := value-i.value
]

dat
#   name value week dfr
#1:   ab     9   31  NA
#2:   ab     9   31  NA
#3:   ab     6   32  -3
#4:   ac    10   31  NA
#5:   ac    10   31  NA
#6:   ac     4   35  NA
#7:    d     8   32  NA
#8:    d     9   33   1
#9:    d     8   35  NA
0 голосов
/ 11 сентября 2018

Достаточно легко сделать с dplyr и немного математики, чтобы гарантировать, что разница отображается только в том случае, если предыдущая неделя была ровно на 1 меньше, чем неделя текущей строки:

library(dplyr)

c <- c %>% 
  group_by(name) %>% 
  mutate(df = c(0, diff(value)) * as.numeric(c(0, diff(week)) == 1))

  name  value  week    df
  <fct> <dbl> <dbl> <dbl>
1 ab        9    31     0
2 ab        9    31     0
3 ab        6    32    -3
4 ac       10    31     0
5 ac       10    31     0
6 ac        4    35     0
7 d         8    32     0
8 d         9    33     1
9 d         8    35     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...