Можно ли преобразовать код SQL в код R? - PullRequest
0 голосов
/ 09 апреля 2020

У меня возникла следующая проблема: я получил базу данных и должен оценить некоторые дельты, например, я уже вычислил это с помощью SQL, и он работает хорошо, но теперь мне нужно попробовать это с R, и я мало работал с R, поэтому я ' Я не совсем уверен, что мои проблемы разрешимы с R. Лучший случай был бы, если бы я мог преобразовать свой код sql в код R. В противном случае я представлю вам мою проблему:

+----+------+------------+
| a  |  b   |     c      |
+----+------+------------+
| 10 |    2 | 31.01.2020 |
| 11 |    5 | 31.01.2020 |
| 10 |    3 | 31.01.2020 |
| 10 |    2 | 31.12.2019 |
| 11 |    4 | 31.12.2019 |
| 10 |   2  | 31.12.2019 |
+----+------+------------+

dput:

structure(list(a = c(10L, 11L, 10L, 10L, 11L, 10L), b = c(2L, 
5L, 3L, 2L, 4L, 2L), c = c("31.01.2020", "31.01.2020", "31.01.2020", 
"31.12.2019", "31.12.2019", "31.12.2019")), row.names = c(NA, 
-6L), class = "data.frame")

delta

+----+---+
| 10 | 1 |
| 11 | 1 |
+----+---+

Это мой первый раз в это сообщество, поэтому я надеюсь, что вы можете увидеть мою фотографию. Это пример моей проблемы:

На первом шаге мне нужно суммировать столбец b для той же даты (c) и того же числа в a). Таким образом, результат для 31.12.2020 будет: 10 = 5 и 11 = 5 и то же самое для 31.12.2019.

До этого момента это работает, но на следующем шаге мне нужно вычислить дельту б) первый столбец а) и c)

Другими словами: для числа 10 в а) я вычислил 5 в 31.01.2020 в 31.12.2019, я вычислил 4 для 10. Теперь я должен вычислить 5-4, но я не могу его запрограммировать.

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

Я был бы очень благодарен, если бы вы могли мне помочь.

Ответы [ 3 ]

1 голос
/ 09 апреля 2020

Вы можете сделать это с помощью data.table. Сначала преобразуйте c в столбец даты.

Затем возьмите сумму b по каждой группе (a, c), затем в пределах групп a полученной таблицы возьмите diff этого сумма. diff будет в правильном направлении, потому что keyby упорядочивает результаты по столбцам группировки.

library(data.table)
setDT(df)
df[, c := as.Date(c, format = '%d.%m.%Y')]

df[, .(bsum = sum(b)), keyby = .(a, c)
  ][, .(bsum_diff = diff(bsum)), by = a]
#     a bsum_diff
# 1: 10         1
# 2: 11         1
1 голос
/ 09 апреля 2020

Используя пакет dplyr, попробуйте что-то вроде этого:

library(dplyr)

df %>%
  mutate(c_date = as.Date(c, format = "%d.%m.%Y")) %>% # convert to a Date in R
  group_by(a, c_date) %>% 
  summarize(b = sum(b)) %>% # sum grouped by a and c
  group_by(a) %>%
  arrange(c_date) %>% # sort on the date
  summarize(delta = diff(b)) # take the difference, grouped on a

Что даст:

# A tibble: 2 x 2
      a delta
  <int> <int>
1    10     1
2    11     1
0 голосов
/ 09 апреля 2020

Не знаю, возможно ли перевести SQL в код R, но работать с базами данных через R не так сложно. В целом: вам нужно установить соединение SQL: DBI :: dbconnect (). Затем с помощью функции tbl () и пакета dplyr вы начинаете реплицировать оператор sql select. Здесь вы можете найти больше информации: https://db.rstudio.com

...