【问题标题】:purrr loop: Error: Problem with `mutate()` input `combined_data`. x `x` and `y` must share the same src, set `copy` = TRUE (may be slow)purrr 循环:错误:`mutate()` 输入`combined_data` 有问题。 x `x` 和 `y` 必须共享同一个 src,设置 `copy` = TRUE(可能很慢)
【发布时间】:2021-03-24 18:41:40
【问题描述】:

我试图创建一个可重现的示例,但令人沮丧的是,这确实有效:

my_mtcars <- mtcars %>% 
  rownames_to_column('car') %>% 
  group_by(vs) %>% 
  nest

my_mtcars <- my_mtcars %>% 
  mutate(lhs = map(.x = data, ~ .x %>% select(car:drat))) %>% 
  mutate(rhs = map(.x = data, ~ .x %>% select(car, wt:carb) %>% rename(model = car))) %>% 
  mutate(together_again = map2(.x = lhs, .y = rhs, ~ inner_join(.x, .y, by = c('car' = 'model'))))

上述方法有效,但简而言之显示了我试图用我的真实数据做什么。我的包含列表列的实际数据框无法通过内部连接进行变异,我希望通过在这里描述和显示一些匿名数据,有人可以提出建议。

我的数据框pdata

data
# A tibble: 104 x 7
   MONETIZATION_WEEK_COHORT data                   cut_off clv_obj          model            prediction       training_period_metrics
   <date>                   <list>                   <int> <list>           <list>           <list>           <list>                 
 1 2020-03-30               <tibble [214,509 × 9]>       7 <named list [2]> <named list [2]> <named list [2]> <tibble [7,328 × 3]>   
 2 2020-03-30               <tibble [214,509 × 9]>       8 <named list [2]> <named list [2]> <named list [2]> <tibble [7,328 × 3]>   
 3 2020-04-06               <tibble [496,626 × 9]>       7 <named list [2]> <named list [2]> <named list [2]> <tibble [20,060 × 3]>  
 4 2020-04-06               <tibble [496,626 × 9]>       8 <named list [2]> <named list [2]> <named list [2]> <tibble [20,060 × 3]>  
 5 2020-04-13               <tibble [595,775 × 9]>       7 <named list [2]> <named list [2]> <named list [2]> <tibble [25,816 × 3]>  
 6 2020-04-13               <tibble [595,775 × 9]>       8 <named list [2]> <named list [2]> <named list [2]> <tibble [25,816 × 3]>  
 7 2020-04-20               <tibble [548,436 × 9]>       7 <named list [2]> <named list [2]> <named list [2]> <tibble [22,161 × 3]>  
 8 2020-04-20               <tibble [548,436 × 9]>       8 <named list [2]> <named list [2]> <named list [2]> <tibble [22,161 × 3]>  
 9 2020-04-27               <tibble [529,507 × 9]>       7 <named list [2]> <named list [2]> <named list [2]> <tibble [21,113 × 3]>  
10 2020-04-27               <tibble [529,507 × 9]>       8 <named list [2]> <named list [2]> <named list [2]> <tibble [21,113 × 3]>  

我正在尝试将预测与每行的训练期指标结合起来。以下是这两个字段的示例,它们都是数据框:

下面map2中的.y字段:

 pdata$prediction[[1]]$result %>% head(2) %>% glimpse
Rows: 2
Columns: 11
$ Id                      <chr> "123abc", "def456"
$ period.first            <date> 2020-05-21, 2020-05-21
$ period.last             <date> 2020-08-26, 2020-08-26
$ period.length           <int> 14, 14
$ actual.x                <int> 0, 0
$ actual.total.spending   <dbl> 0, 0
$ PAlive                  <dbl> 0.72933712, 0.05683547
$ CET                     <dbl> 19.2692978, 0.1285307
$ DERT                    <dbl> 13.37550762, 0.08921192
$ predicted.mean.spending <dbl> 839.648, 1017.683
$ predicted.CLV           <dbl> 11230.71800, 90.78944

下面map2中的.x字段:

pdata$training_period_metrics[[1]] %>% head(2) %>% glimpse
Rows: 2
Columns: 3
$ S              <chr> "abc123", "def456"
$ Transactions   <int> 40, 3
$ Total_Spending <dbl> 14660, 1797

我正在尝试将这些作为新列加入数据框中:

pdata %>% mutate(combined_data = map2(.x = training_period_metrics, .y = prediction, ~ inner_join(.x, .y$result, by = c('S' = 'Id'))))
Error: Problem with `mutate()` input `combined_data`.
x `x` and `y` must share the same src, set `copy` = TRUE (may be slow).
ℹ Input `combined_data` is `map2(...)`.

如何在我的 purrr 循环中加入 prediction$resulttraining_period_metrics

【问题讨论】:

  • 请检查右轴或左轴中的所有元素是否都有数据,即如果我有my_mtcars$rhs[[2]] &lt;- NULL; my_mtcars %&gt;% mutate(together_again = map2(.x = lhs, .y = rhs, ~ inner_join(.x, .y, by = c('car' = 'model'))))# Error: Problem with mutate()` 输入together_again。 ✖ xy 必须共享同一个 src,设置 copy = TRUE(可能很慢)。`
  • 啊哈!是的,其中一些是 NULL
  • 如果您通过跳过这些元素来纠正它们,那将是可行的。目前尚不清楚这些情况您想要什么样的条件
  • 在 NULL 的情况下,我想将新的 df 设为 NULL 或 NA(我不明白这里哪个最好)否则我想加入
  • 您可以尝试下面发布的解决方案。

标签: r dplyr purrr


【解决方案1】:

只有当.x.y 都不是NULL 或者返回NULL 时,我们才能使用条件进行连接

my_mtcars %>%
    mutate(together_again = map2(.x = lhs, .y = rhs,
  ~ if(is.null(unlist(.x))|is.null(unlist(.y))) list(NULL) else
        inner_join(.x, .y, by = c('car' = 'model'))))

【讨论】:

  • 我自己应该能够做到这一点,但我正在尝试将您的解决方案修改为 ifelse() 语法,但未能成功。在这里可行吗?
  • @user14328853 ifelse 不适合这种情况。它对所有元素都进行了矢量化处理,但在我们的例子中,元素(即 data.frames)在一个列表中,所以if/else 会更好。
  • 或者另一种选择是用tryCatch包装,并在出现错误时返回一个值
  • 我查看了 r 中 tryCatch 的文档。我觉得很难跟上。我的实际代码%&gt;% mutate(combined_data = map2(.x = training_period_metrics, .y = prediction, ~ tryCatch(inner_join(.x, .y$result, by = c('S' = 'Id'))))) 给出了同样的错误。我应该问一个新问题吗?
  • @user14328853 这个link 可以帮助你写tryCatch。在您的代码中,您必须指定 error =
猜你喜欢
  • 2023-04-04
  • 2021-08-02
  • 2021-06-05
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 2020-12-19
相关资源
最近更新 更多