Как создать столбец из накопительного столбца в r? - PullRequest
1 голос
/ 19 марта 2020
df <- data.frame(dat=c("11-03","12-03","13-03"), 
c=c(0,15,20,4,19,21,2,10,14), d=rep(c("A","B","C"),each=3))

предположим, c имеет совокупные значения. Я хочу создать столбец daily, который будет выглядеть как

dat c d daily 1 11-03 0 A 0 2 12-03 15 A 15 3 13-03 20 A 5 4 11-03 4 B 4 5 12-03 19 B 15 6 13-03 21 B 2 7 11-03 2 C 2 8 12-03 10 C 8 9 13-03 14 C 4

для каждого значения d и dat (по дате), генерируется ежедневное изменение значения из столбца c имеет это совокупное значение.

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Мы можем получить diff из 'c' после группировки по 'd'

library(dplyr)
df %>% 
    group_by(d) %>%
    mutate(daily = c(first(c), diff(c)))
# A tibble: 9 x 4
# Groups:   d [3]
#  dat       c d     daily
#  <fct> <dbl> <fct> <dbl>
#1 11-03     0 A         0
#2 12-03    15 A        15
#3 13-03    20 A         5
#4 11-03     4 B         4
#5 12-03    19 B        15
#6 13-03    21 B         2
#7 11-03     2 C         2
#8 12-03    10 C         8
#9 13-03    14 C         4

Или сделать разницу между 'c' и lag из 'c'

df %>%
   group_by(d) %>%
   mutate(daily = c - lag(c))
0 голосов
/ 19 марта 2020

Data.table решение:

df <- as.data.table(df)
df[, daily:= c - shift(c, fill = 0),by=d]

Shift является оператором задержки в datatable, поэтому в основном мы вычитаем C его предыдущее значение в каждой группе.

fill = 0 заменяет NA на нули, потому что в каждой группе нет предыдущего значения (смещение (c)) для первого элемента.

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