Инженерные изменения среди групп в R / dplyr - PullRequest
2 голосов
/ 04 апреля 2019

Застрял в вычислении в R. Предположим, у меня есть следующий фрейм данных:

Name | Date | Count
Bob | 2019-03-03 | 253
Bob | 2019-03-03 | 253
Bob | 2019-03-02 | 252
Bob | 2019-03-01 | 251
Tim | 2019-03-04 | 257
Tim | 2019-03-04 | 257
Tim | 2019-03-04 | 256
Tim | 2019-03-03 | 254

Моя цель - создать колонку абсолютных изменений, вот так:

Name | Date | Count | Change
Bob | 2019-03-03 | 253 | 0
Bob | 2019-03-03 | 253 | 1
Bob | 2019-03-02 | 252 | 1
Bob | 2019-03-01 | 251 | 0
Tim | 2019-03-04 | 257 | 0
Tim | 2019-03-04 | 257 | 1
Tim | 2019-03-04 | 256 | 2
Tim | 2019-03-03 | 254 | 0

Я могу, очевидно,

df %>% group_by(Name) %>% arrange(desc(Date)) %>% arrange(desc(Count))

но после этого я потерялся. Могу ли я как-то видоизменить (Изменить = Количество)?

Ответы [ 3 ]

4 голосов
/ 04 апреля 2019

Решение с использованием diff от базы R и dplyr.

library(dplyr)
library(tidyr)

df2 <- df %>%
  group_by(Name) %>%
  mutate(Change = c(-diff(Count), 0)) %>%
  ungroup()
df2
# # A tibble: 8 x 4
#   Name  Date       Count Change
#   <chr> <chr>      <int>  <dbl>
# 1 Bob   2019-03-03   253      0
# 2 Bob   2019-03-03   253      1
# 3 Bob   2019-03-02   252      1
# 4 Bob   2019-03-01   251      0
# 5 Tim   2019-03-04   257      0
# 6 Tim   2019-03-04   257      1
# 7 Tim   2019-03-04   256      2
# 8 Tim   2019-03-03   254      0

ДАННЫЕ

df <- read.table(text = "Name|Date|Count
Bob|'2019-03-03'|253
Bob|'2019-03-03'|253
Bob|'2019-03-02'|252
Bob|'2019-03-01'|251
Tim|'2019-03-04'|257
Tim|'2019-03-04'|257
Tim|'2019-03-04'|256
Tim|'2019-03-03'|254",
                 header = TRUE, stringsAsFactors = FALSE, sep = "|")
3 голосов
/ 04 апреля 2019

Мы можем group_by Name и использовать lead из dplyr для вычитания значений в текущей строке на следующую строку.

library(dplyr)

df %>%
  group_by(Name) %>%
  mutate(Change = Count - lead(Count, default = last(Count)))

#  Name  Date       Count Change
#  <chr> <chr>      <dbl>  <dbl>
#1 Bob   2019-03-03   253      0
#2 Bob   2019-03-03   253      1
#3 Bob   2019-03-02   252      1
#4 Bob   2019-03-01   251      0
#5 Tim   2019-03-04   257      0
#6 Tim   2019-03-04   257      1
#7 Tim   2019-03-04   256      2
#8 Tim   2019-03-03   254      0

Базовый подход R с использованием ave

with(df, ave(Count, Name, FUN = function(x) c(x[-length(x)] - x[-1], 0)))
#[1] 0 1 1 0 0 1 2 0
1 голос
/ 04 апреля 2019

Использование data.table

library(data.table)
setDT(df)[,  Change := Count - shift(Count, fill = last(Count), 
                type = 'lead'), Name][]
#   Name       Date Count Change
#1:  Bob 2019-03-03   253      0
#2:  Bob 2019-03-03   253      1
#3:  Bob 2019-03-02   252      1
#4:  Bob 2019-03-01   251      0
#5:  Tim 2019-03-04   257      0
#6:  Tim 2019-03-04   257      1
#7:  Tim 2019-03-04   256      2
#8:  Tim 2019-03-03   254      0

ПРИМЕЧАНИЕ. Это также дубликат этого или этого или этого или этого сообщения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...