Как расширить сгруппированные данные в R с помощью dplyr? - PullRequest
1 голос
/ 23 февраля 2020

Можно ли добиться результата следующего кода более эффективным и лаконичным способом? Из-за характера моей задачи я не могу использовать функции base или tidyr, потому что код dplyr необходимо преобразовать в SQL и выполнить в базе данных.

library(dplyr)
library(dbplyr)
library(RSQLite)
library(DBI)

# Create example data set
id <- c("a", "b", "c")
df <- data.frame(id)

# Treat it as a data base table
con <- DBI::dbConnect(RSQLite::SQLite(), path = ":memory:")
copy_to(con, df, "data", temporary = FALSE)

# Expand to data set and create a variable for four quarters
n <- 4

data <- tbl(con, "data") %>%
    mutate(quarter = 1)

for (i in 2:n) {
    data <- data %>%
        mutate(quarter = i) %>%
        union(data, data) %>%
        show_query()
}

data <- collect(data)

Моя цель в моем примере из реальной жизни это запрос списка идентификаторов и расширение его до набора данных с переменной «четверть». Я хочу использовать этот список в качестве основы для последовательного присоединения дополнительной информации позже.

1 Ответ

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

Звучит так, как будто вы хотите получить декартово произведение id = c('a', 'b', 'c') и quarters = c(1, 2, 3, 4), которое даст вам id_quarter = c(('a',1), ('a',2), ('a',3), ..., ('c',4)).

. Это можно сделать с помощью соединения с фиктивной переменной, например:

id <- c("a", "b", "c")
df <- data.frame(id)
quarter <- c(1, 2, 3, 4)
df_q <- data.frame(quarter)

# Treat it as a data base table
con <- DBI::dbConnect(RSQLite::SQLite(), path = ":memory:")
copy_to(con, df, "data", temporary = FALSE)
copy_to(con, df_q, "quarter", temporary = FALSE)

# create placeholder column
data <- tbl(con, "data") %>%
    mutate(dummy_placeholder = 1)
quarters <- tbl(con, "quarter") %>%
    mutate(dummy_placeholder = 1)

# join and collect
result <- data %>%
    inner_join(quarter, by = "dummy_placeholder") %>%
    collect()
...