Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 28 additions & 16 deletions R/cansim_metadata.R
Original file line number Diff line number Diff line change
Expand Up @@ -363,31 +363,43 @@ get_cansim_table_template <- function(cansimTableNumber, language="english",refr
dimensions <- member_info %>%
select("dimensionPositionId", "dimensionName") %>%
unique() %>%
arrange("dimensionPositionId")
arrange(.data$dimensionPositionId)

result <- tibble(...link="link",COORDINATE="")
# Build dimension data for expand_grid (more efficient than iterative full_join)
dim_list <- list()
dim_names <- character(nrow(dimensions))
member_id_cols <- character(nrow(dimensions))

for (i in seq_len(nrow(dimensions))) {
dim <- dimensions[i,]
dim_name <- dim$dimensionName
member <- member_info %>%
filter(.data$dimensionPositionId==dim$dimensionPositionId) %>%
dim_names[i] <- dim_name
member_id_col <- paste0("...mid_", i)
member_id_cols[i] <- member_id_col

members <- member_info %>%
filter(.data$dimensionPositionId == dim$dimensionPositionId) %>%
select("memberId", "memberName") %>%
unique() %>%
arrange("memberId") %>%
rename(!!dim_name:="memberName") %>%
mutate(...link="link")

result <- result %>%
full_join(member, by="...link",
relationship = "many-to-many") %>%
mutate(COORDINATE=ifelse(.data$COORDINATE=="", .data$memberId, paste0(.data$COORDINATE, ".", .data$memberId))) %>%
select(-any_of("memberId"))
unique()

dim_data <- tibble(
!!dim_name := members$memberName,
!!member_id_col := members$memberId
)
dim_list[[i]] <- dim_data
}

# Create Cartesian product in one operation
result <- do.call(tidyr::expand_grid, dim_list)

# Build COORDINATE column using vectorized paste
coord_cols <- lapply(member_id_cols, function(col) result[[col]])
result$COORDINATE <- do.call(paste, c(coord_cols, sep = "."))

# Reorder columns: cansimTableNumber, COORDINATE, then dimension columns
result <- result %>%
select(-any_of("...link")) %>%
mutate(cansimTableNumber=!!cansimTableNumber,.before="COORDINATE")
mutate(cansimTableNumber = !!cansimTableNumber) %>%
select("cansimTableNumber", "COORDINATE", all_of(dim_names))

attr(result, "cansimTableNumber") <- cansimTableNumber
attr(result, "langauge") <- language
Expand Down