Как рассчитать разницу между двумя значениями без даты в одном столбце в одной группе? - PullRequest
0 голосов
/ 21 февраля 2020

Это дополнительный вопрос к этому сообщению: В R как подсчитать количество сгруппированных пар, в которых значение столбца в одной строке больше другого?

Вот мой dput для набора данных df1:

structure(list(Name = c("A.J. Ellis", "A.J. Ellis", "A.J. Pierzynski", 
"A.J. Pierzynski", "Aaron Boone", "Adam Kennedy", "Adam Melhuse", 
"Adrian Beltre", "Adrian Beltre", "Adrian Gonzalez", "Alan Zinter", 
"Albert Pujols", "Albert Pujols"), Age = c(37, 36, 37, 36, 36, 
36, 36, 37, 36, 36, 36, 37, 36), Year = c(2018, 2017, 2014, 2013, 
2009, 2012, 2008, 2016, 2015, 2018, 2004, 2017, 2016), Tm = c("SDP", 
"MIA", "TOT", "TEX", "HOU", "LAD", "TOT", "TEX", "TEX", "NYM", 
"ARI", "LAA", "LAA"), Lg = c("NL", "NL", "ML", "AL", "NL", "NL", 
"ML", "AL", "AL", "NL", "NL", "AL", "AL"), G = c(66, 51, 102, 
134, 10, 86, 15, 153, 143, 54, 28, 149, 152), PA = c(183, 163, 
362, 529, 14, 201, 32, 640, 619, 187, 40, 636, 650)), row.names = c(NA, 
13L), class = "data.frame")

Вот код, который для моей предыдущей задачи правильно сопоставил пары:

df1 %>%
  arrange(Name, Age) %>%
  group_by(Name) %>%
  filter(last(G) < first(G))

Каждая сгруппированная пара имеет два наблюдения. У каждого также есть столбец с именем G и столбец Year.

Вот как выглядят данные после группировки с использованием приведенного выше кода: https://www.dropbox.com/s/hh2qgkbn4cy4k4l/Data%20after%20grouping.png?dl=0

Теперь, что Я хотел бы знать, что для каждой подходящей пары есть разница в значении «столбец G» между значением «Возраст 37» и значением «Возраст 36», выполняя следующие вычисления: (значение 36 лет) - (значение 37 лет). Отрицательный результат - это нормально.

Кроме того, для всех сопоставленных пар в наборе данных я хотел бы получить сумму этих разностей.

1 Ответ

1 голос
/ 21 февраля 2020

Если я вас правильно понимаю:

df <- structure(list(Name = c("A.J. Ellis", "A.J. Ellis", "A.J. Pierzynski", 
                        "A.J. Pierzynski", "Aaron Boone", "Adam Kennedy", "Adam Melhuse", 
                        "Adrian Beltre", "Adrian Beltre", "Adrian Gonzalez", "Alan Zinter", 
                        "Albert Pujols", "Albert Pujols"), Age = c(37, 36, 37, 36, 36, 
                                                                   36, 36, 37, 36, 36, 36, 37, 36), Year = c(2018, 2017, 2014, 2013, 
                                                                                                             2009, 2012, 2008, 2016, 2015, 2018, 2004, 2017, 2016), Tm = c("SDP", 
                                                                                                                                                                           "MIA", "TOT", "TEX", "HOU", "LAD", "TOT", "TEX", "TEX", "NYM", 
                                                                                                                                                                           "ARI", "LAA", "LAA"), Lg = c("NL", "NL", "ML", "AL", "NL", "NL", 
                                                                                                                                                                                                        "ML", "AL", "AL", "NL", "NL", "AL", "AL"), G = c(66, 51, 102, 
                                                                                                                                                                                                                                                         134, 10, 86, 15, 153, 143, 54, 28, 149, 152), PA = c(183, 163, 
                                                                                                                                                                                                                                                                                                              362, 529, 14, 201, 32, 640, 619, 187, 40, 636, 650)), row.names = c(NA, 
                                                                                                                                                                                                                                                                                                                                                                                  13L), class = "data.frame")
df1 <- df %>%
  arrange(Name, Age) %>%
  group_by(Name) %>%
  filter(last(G) < first(G)) %>% 
  mutate(g_diff = G[1] - G[2]) %>% 
  ungroup() %>% 
  mutate(sum_g_diff = sum(unique(g_diff)))

> df1
# A tibble: 4 x 9
  Name              Age  Year Tm    Lg        G    PA g_diff sum_g_diff
  <chr>           <dbl> <dbl> <chr> <chr> <dbl> <dbl>  <dbl>      <dbl>
1 A.J. Pierzynski    36  2013 TEX   AL      134   529     32         35
2 A.J. Pierzynski    37  2014 TOT   ML      102   362     32         35
3 Albert Pujols      36  2016 LAA   AL      152   650      3         35
4 Albert Pujols      37  2017 LAA   AL      149   636      3         35

Или, если кумулятивная сумма (промежуточная сумма) g_diff является желаемым результатом (без суммирования данных):

df1 %>%
  group_by(Name) %>%
  mutate(cols = c(g_diff[1], rep(0, n() -1))) %>%
  ungroup() %>%
  mutate(cum_sum = cumsum(cols)) %>%
  select(-cols)

# A tibble: 4 x 9
  Name              Age  Year Tm    Lg        G    PA g_diff cum_sum
  <chr>           <dbl> <dbl> <chr> <chr> <dbl> <dbl>  <dbl>   <dbl>
1 A.J. Pierzynski    36  2013 TEX   AL      134   529     32      32
2 A.J. Pierzynski    37  2014 TOT   ML      102   362     32      32
3 Albert Pujols      36  2016 LAA   AL      152   650      3      35
4 Albert Pujols      37  2017 LAA   AL      149   636      3      35

(Это решение основано на этом вопросе)

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