【问题标题】:map2() function in pipe管道中的map2()函数
【发布时间】:2018-05-15 19:01:40
【问题描述】:

我得到了如下的 tibble 结果

> df
# A tibble: 6 x 5
terms results              R.squared        minP  maxP
<dbl> <list>                   <dbl>       <dbl> <dbl>
1    11 <tibble [6 x 9]>         0.589 0.269       0.939
2    10 <tibble [49 x 9]>        0.589 0.181       0.999
3     9 <tibble [200 x 9]>       0.589 0.0655      1.000
4     8 <tibble [527 x 9]>       0.585 0.000154    0.997
5     7 <tibble [972 x 9]>       0.565 0.0000607   0.998
6     6 <tibble [1,273 x 9]>     0.542 0.000000977 0.998    

&lt;list&gt; tibbleresults中保存了一些建模信息,其中有几个列,名称如“Formula”、“maxp”、“R.squared”等。

我要做的是在df$results 中找到对应的行,其中maxp 等于dfminP

我可以通过map2_df(df$results, df$minP,function(x, y) filter(x, x$maxp==y))得到结果

现在,我想将此步骤与之前的所有其他步骤一起通过管道传输,例如

....%&gt;% map2_df(results, minP,function(x, y) filter(x, x$maxp==y))....%&gt;%是生成df的步骤。

很遗憾,我不断收到错误消息Error in as_mapper(.f, ...) : object 'y' not found

有什么建议吗?

更新:

这是一个可重现的例子:

df <- tibble(x = list(data.frame(a = c(1, 2, 5)), 
data.frame(a = c(1,2,3,4,9)), 
data.frame(a = c(3, 4, 6, 8))),
y = c(5, 4, 6))

> df 
# A tibble: 3 x 2
x                        y
<list>               <dbl>
1 <data.frame [3 x 1]>     5
2 <data.frame [5 x 1]>     4
3 <data.frame [4 x 1]>     6

我可以运行map2_df(df$x, df$y, function(x, y) filter(x, x$a==y)),但是当我尝试df %&gt;% map2(x, y, function(x, y) filter(x, x$a==y)) 时,我得到了Error in as_mapper(.f, ...) : object 'y' not found

【问题讨论】:

  • 您可以使用unnest 退出列表列,然后使用filter 选择正确的行吗? (unnest 将要求列表元素是具有相同列数的数据框,如果我没记错的话)
  • 寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。
  • 有一些方法可以解决这个问题,但最简单的方法是更改​​名称以区分两者并避免名称冲突。
  • 等等,在新示例中,要使用 xy 裸露,您必须在 mutate 中。 purrr 函数不将数据帧作为它们的第一个参数来启用像 dplyr 这样的非标准评估;它们只是正常的功能。

标签: r tidyverse purrr


【解决方案1】:

我担心您的示例可能比您的实际数据更简单,但它看起来像这样:

library(tidyverse)

df <- tibble(x = list(data.frame(a = c(1, 2, 5)), 
                      data.frame(a = c(1,2,3,4,9)), 
                      data.frame(a = c(3, 4, 6, 8))),
             y = c(5, 4, 6))

df %>% 
    mutate(x = map2(x, y, ~filter(.x, a == .y))) %>% 
    unnest()
#> # A tibble: 3 x 2
#>       y     a
#>   <dbl> <dbl>
#> 1     5     5
#> 2     4     4
#> 3     6     6

注意.x 是一个数据框,.y 是一个向量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多