отображение и left_joining два списка вместе - PullRequest
1 голос
/ 09 ноября 2019

Я пытаюсь объединить два списка вместе. Я хотел бы использовать left_join, так как я знаю это, но это не работает.

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

map(df2, ~left_join(., df1, by = "station"))
map(df2, ~reduce(., df1, by = "station"))

список 1 в df1 соответствует списку 2 в df2, поэтому я использую функцию map. Я хотел бы просто объединить их на основе значения station. Вывод для одного списка будет выглядеть так:

# A tibble: 4 x 11
  date         day month  year quarter semester weekday station        value stat  statistic
  <date>     <int> <dbl> <dbl>   <int>    <int>   <dbl> <chr>          <dbl> <chr>     <dbl>
1 2016-01-01     1     1  2016       1        1       1 c_farolillo       17 mean       21.3
2 2016-01-01     1     1  2016       1        1       1 c_farolillo       17 sd         30.0
3 2016-01-01     1     1  2016       1        1       1 plaza_eliptica    25 mean       48.6
4 2016-01-01     1     1  2016       1        1       1 plaza_eliptica    25 sd         47.1

Данные:

df1 <- list(structure(list(station = c("c_farolillo", "plaza_eliptica", 
"c_farolillo", "plaza_eliptica"), stat = c("mean", "mean", "sd", 
"sd"), statistic = c(21.2942922374429, 48.5710301846855, 30.030258443028, 
47.0516928425878)), row.names = c(NA, -4L), class = c("tbl_df", 
"tbl", "data.frame")), structure(list(station = c("c_farolillo", 
"plaza_eliptica", "c_farolillo", "plaza_eliptica"), stat = c("mean", 
"mean", "sd", "sd"), statistic = c(21.2993150684932, 48.5605316914534, 
30.0286190461173, 47.0543871206842)), row.names = c(NA, -4L), class = c("tbl_df", 
"tbl", "data.frame")), structure(list(station = c("c_farolillo", 
"plaza_eliptica", "c_farolillo", "plaza_eliptica"), stat = c("mean", 
"mean", "sd", "sd"), statistic = c(21.2947488584475, 48.551889593794, 
30.0297291333284, 47.0562416513092)), row.names = c(NA, -4L), class = c("tbl_df", 
"tbl", "data.frame")), structure(list(station = c("c_farolillo", 
"plaza_eliptica", "c_farolillo", "plaza_eliptica"), stat = c("mean", 
"mean", "sd", "sd"), statistic = c(21.2778538812785, 48.5382545766386, 
30.0267943793948, 47.0607680244109)), row.names = c(NA, -4L), class = c("tbl_df", 
"tbl", "data.frame")), structure(list(station = c("c_farolillo", 
"plaza_eliptica", "c_farolillo", "plaza_eliptica"), stat = c("mean", 
"mean", "sd", "sd"), statistic = c(21.2614155251142, 48.5214531240057, 
30.0269420596686, 47.0676011750263)), row.names = c(NA, -4L), class = c("tbl_df", 
"tbl", "data.frame")), structure(list(station = c("c_farolillo", 
"plaza_eliptica", "c_farolillo", "plaza_eliptica"), stat = c("mean", 
"mean", "sd", "sd"), statistic = c(21.253196347032, 48.5055948249362, 
30.0292032528186, 47.0737183354519)), row.names = c(NA, -4L), class = c("tbl_df", 
"tbl", "data.frame")))


df2 <- list(structure(list(date = structure(c(16801, 16801), class = "Date"), 
    day = c(1L, 1L), month = c(1, 1), year = c(2016, 2016), quarter = c(1L, 
    1L), semester = c(1L, 1L), weekday = c(1, 1), station = c("c_farolillo", 
    "plaza_eliptica"), value = c(17, 25)), row.names = c(NA, 
-2L), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    date = structure(c(16802, 16802), class = "Date"), day = c(2L, 
    2L), month = c(1, 1), year = c(2016, 2016), quarter = c(1L, 
    1L), semester = c(1L, 1L), weekday = c(0, 0), station = c("c_farolillo", 
    "plaza_eliptica"), value = c(9, 29)), row.names = c(NA, -2L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    date = structure(c(16803, 16803), class = "Date"), day = c(3L, 
    3L), month = c(1, 1), year = c(2016, 2016), quarter = c(1L, 
    1L), semester = c(1L, 1L), weekday = c(0, 0), station = c("c_farolillo", 
    "plaza_eliptica"), value = c(8, 18)), row.names = c(NA, -2L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    date = structure(c(16804, 16804), class = "Date"), day = c(4L, 
    4L), month = c(1, 1), year = c(2016, 2016), quarter = c(1L, 
    1L), semester = c(1L, 1L), weekday = c(1, 1), station = c("c_farolillo", 
    "plaza_eliptica"), value = c(3, 11)), row.names = c(NA, -2L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    date = structure(c(16805, 16805), class = "Date"), day = c(5L, 
    5L), month = c(1, 1), year = c(2016, 2016), quarter = c(1L, 
    1L), semester = c(1L, 1L), weekday = c(1, 1), station = c("c_farolillo", 
    "plaza_eliptica"), value = c(4, 13)), row.names = c(NA, -2L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    date = structure(c(16806, 16806), class = "Date"), day = c(6L, 
    6L), month = c(1, 1), year = c(2016, 2016), quarter = c(1L, 
    1L), semester = c(1L, 1L), weekday = c(0, 0), station = c("c_farolillo", 
    "plaza_eliptica"), value = c(4, 9)), row.names = c(NA, -2L
), class = c("tbl_df", "tbl", "data.frame")))

1 Ответ

1 голос
/ 09 ноября 2019

Вместо map мы можем использовать map2, который принимает два объекта вместо одного в map

library(purrr)
library(dplyr)
map2(df2, df1, left_join, by = 'station')
#[[1]]
# A tibble: 4 x 11
#  date         day month  year quarter semester weekday station        value stat  statistic
#  <date>     <int> <dbl> <dbl>   <int>    <int>   <dbl> <chr>          <dbl> <chr>     <dbl>
#1 2016-01-01     1     1  2016       1        1       1 c_farolillo       17 mean       21.3
#2 2016-01-01     1     1  2016       1        1       1 c_farolillo       17 sd         30.0
#3 2016-01-01     1     1  2016       1        1       1 plaza_eliptica    25 mean       48.6
#4 2016-01-01     1     1  2016       1        1       1 plaza_eliptica    25 sd         47.1

#[[2]]
#...

В base R, это можно сделатьс Map

Map(merge, df2, df1, MoreArgs = list(by = 'station', all.x = TRUE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...