Использование функций purrr для левого соединения и связывания строк - PullRequest
1 голос
/ 01 июля 2019

Я создал функцию очистки веб-страниц, которая принимает множество аргументов.Давайте использовать примеры аргументов в демонстрационных целях.

Аргументы: year, type, gender и col_types.

Моя функция принимает указанные аргументы и очищает данные для возврата df.

Я хочу присоединиться к alternate col_types до standard на основе матчей в year, type, gender, name.

ТогдаЯ хочу привязать все строки к одному df.

Пример данных:

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

# Sample DF
a <- tibble(year = 2019, type = "full_year", col_types = "standard", gender = "M", name = c("a","b","c"), variable_1 = 1:3)
b <- tibble(year = 2019, type = "full_year", col_types = "alternate", gender = "M", name = c("a","b","c"), variable_2 = 1:3, variable_3 = 8:10)
c <- tibble(year = 2019, type = "full_year", col_types = "standard", gender = "F", name = c("ab","ba","ca"), variable_1 = 4:6)
d <- tibble(year = 2019, type = "full_year", col_types = "alternate", gender = "F", name = c("ab","ba","ca"), variable_2 = 1:3, variable_3 = 16:18)
e <- tibble(year = 2019, type = "last_month", col_types = "standard", gender = "M", name = c("a","b","c"), variable_1 = 1:3)
f <- tibble(year = 2019, type = "last_month", col_types = "alternate", gender = "M", name = c("a","b","c"), variable_2 = 1:3, variable_3 = 8:10)
g <- tibble(year = 2019, type = "last_month", col_types = "standard", gender = "F", name = c("ab","ba","ca"), variable_1 = 4:6)
h <- tibble(year = 2019, type = "last_month", col_types = "alternate", gender = "F", name = c("ab","ba","ca"), variable_2 = 1:3, variable_3 = 16:18)


# I know this is not going to work as it presents me with NA where I want there to be joins
df <- bind_rows(a, b, c, d, e, f, g, h)

# Adding desired output
df <- bind_rows(a, b, c, d, e, f, g, h)

m_fy_join <- 
  a %>% 
  left_join(b %>% select(-matches("col_types")))

f_fy_join <- 
  c %>% 
  left_join(d %>% select(-matches("col_types")))

m_lm_join <-
  e %>% 
  left_join(f %>% select(-matches("col_types")))

f_lm_join <-
  g %>% 
  left_join(h %>% select(-matches("col_types")))

# Desired Output
desired_output <- bind_rows(m_fy_join, f_fy_join, m_lm_join, f_lm_join)

Какую purrr функцию я могу использовать, чтобы выполнить left_join, а затем связать строки?

Ответы [ 2 ]

0 голосов
/ 02 июля 2019
library(dplyr)
library(purrr)

my_join_function <- function(df1, df2) {
  x <- get(df1)
  y <- get(df2)
  left_join(x, select(y, -matches("col_types")))
}

desired_output2 <- map2_df(
  .x = c("a", "c", "e", "g"), 
  .y = c("b", "d", "f", "h"), 
  .f = my_join_function
)
testthat::expect_error(testthat::expect_identical(desired_output, desired_output2))

Ошибка: testthat::expect_identical(desired_output, desired_output2) не выдал ошибку.

0 голосов
/ 01 июля 2019

Я не думаю, что вам обязательно нужно присоединиться.Вы можете связать все тиблы вместе и использовать объединение, чтобы избавиться от NA (которые возникают из-за того, что «стандартные» не имеют переменную 2/3, а «альтернативные» не имеют переменную 1),

Я думаю, что это может быть самым простым, учитывая то, как ваши данные в настоящее время расположены.Но вы можете подумать о реинжиниринге процесса (если это возможно), чтобы все «альтернативные» тиблы добавлялись в один список при создании, а все «стандартные» тиблы добавлялись в другой, так что вы можете просто rbind_list каждый из нихи соедините их вместе, вместо того, чтобы придумать способ управления кучей тиблей, которые все смешаны вместе.

library(tidyverse)

bind_rows(a, b, c, d, e, f, g, h) %>% 
  group_by(year, type, gender, name) %>% 
  summarise_at(vars(contains('variable')), reduce, coalesce)

# # A tibble: 12 x 7
# # Groups:   year, type, gender [4]
#     year type       gender name  variable_1 variable_2 variable_3
#    <dbl> <chr>      <chr>  <chr>      <int>      <int>      <int>
#  1  2019 full_year  F      ab             4          1         16
#  2  2019 full_year  F      ba             5          2         17
#  3  2019 full_year  F      ca             6          3         18
#  4  2019 full_year  M      a              1          1          8
#  5  2019 full_year  M      b              2          2          9
#  6  2019 full_year  M      c              3          3         10
#  7  2019 last_month F      ab             4          1         16
#  8  2019 last_month F      ba             5          2         17
#  9  2019 last_month F      ca             6          3         18
# 10  2019 last_month M      a              1          1          8
# 11  2019 last_month M      b              2          2          9
# 12  2019 last_month M      c              3          3         10

Редактировать: Спасибо за показ желаемого результата.Я проверил, и этот вывод эквивалентен, за исключением порядка и того факта, что у него нет столбца col_types,

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