Как создать подмножество и применить функцию к набору данных - PullRequest
2 голосов
/ 19 июня 2019

У меня есть список цен для различных элементов в одном и том же наборе данных.

abc1 <- c("2005-09-18", "ABC", 99.00)
abc2 <- c("2005-09-19", "ABC", 98.00)
abc3 <- c("2005-09-20", "ABC", 98.50)
abc4 <- c("2005-09-21", "ABC", 97.75)
def1 <- c("2005-09-14", "DEF", 79.00)
def2 <- c("2005-09-15", "DEF", 78.00)
def3 <- c("2005-09-16", "DEF", 78.50)
def4 <- c("2005-09-20", "DEF", 77.75)

df <- data.frame(rbind(abc1, abc2, abc3, abc4, def1, def2, def3, def4))

Приведенная выше быстрая таблица приведет к:

             X1  X2    X3
abc1 2005-09-18 ABC    99
abc2 2005-09-19 ABC    98
abc3 2005-09-20 ABC  98.5
abc4 2005-09-21 ABC 97.75
def1 2005-09-14 DEF    79
def2 2005-09-15 DEF    78
def3 2005-09-16 DEF  78.5
def4 2005-09-20 DEF 77.75

Я хотел бы добавить столбецскажем, X4, который будет изменением сегодняшнего дня по сравнению с предыдущим днем ​​для конкретного X2.Таким образом, x4 будет иметь следующее значение:

 X4
 0,0%
-1,0%
 0,5%
-0,8%
 0,0%
-1,3%
 0,6%
-1,0%

Цель состоит в том, чтобы сделать это для всех различных предметов в X3.В идеале без разделения стола.Я думаю, что дата всегда будет в правильном порядке, но на всякий случай.

Ответы [ 2 ]

3 голосов
/ 19 июня 2019

Мы можем сгруппировать по 'X2' и взять разницу соседних элементов с diff

library(dplyr)
df %>%
   group_by(X2) %>%
   mutate(X4 = c(0, diff(X3)))

Или после группировки по 'X2' возьмите разницу между 'X2' и lag из 'X2'

df %>%
   group_by(X2) %>%
   mutate(X4 = X3 - lag(X3, default = first(X3)))
2 голосов
/ 19 июня 2019

Небольшой совет: вы хотели рассчитать разницу в процентах, а не абсолютную разницу.

Для этого нужно изменить формулу, иначе ваши результаты будут неправильными: -).

df %>%
  dplyr::group_by(X2) %>%
  dplyr::mutate(X4 = (X3/lag(X3, default = first(X3)) - 1) * 100)

  X1         X2       X3     X4
  <fct>      <fct> <dbl>  <dbl>
1 2005-09-18 ABC    99    0    
2 2005-09-19 ABC    98   -1.01 
3 2005-09-20 ABC    98.5  0.510
4 2005-09-21 ABC    97.8 -0.761
5 2005-09-14 DEF    79    0    
6 2005-09-15 DEF    78   -1.27 
7 2005-09-16 DEF    78.5  0.641
8 2005-09-20 DEF    77.8 -0.955
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...