【问题标题】:How to put multiple return from a function in one or more columns using `tidyverse` packages如何使用 tidyverse 包将函数的多个返回值放在一个或多个列中
【发布时间】:2020-07-21 16:10:03
【问题描述】:

这是我的问题:我有一个函数,它需要 1 个双精度并返回几个双精度,我想直接将它们放在 tibble 的不同列上。我用mutate() 和/或map() 尝试了几种方法。

我不想调用该方法 n 次,并且每次都取函数返回的列表的不同元素。

这是我正在尝试做的一个通用问题:

library(tidyverse)

## a random function that return more than 1 element
f <- function(x){
  return(list(x/2,x**2))
}

## a tibble with a column on which I apply the function
tib <- tibble( x = rep(100:120)) 

tib%>%
  mutate(y = f(x))

## error: 
#Error : Problem with `mutate()` input `y`.
#x Input `y` can't be recycled to size 21.
#ℹ Input `y` is `f(x)`.
#ℹ Input `y` must be size 21 or 1, not 2.

## what I want to avoid:
tib %>%
  mutate(y = f(x)[[1]], z = f(x)[[2]])

我已经为这个问题苦苦挣扎了一段时间。抱歉,如果已经回答了,我在几个论坛上搜索了答案,但一无所获。

提前谢谢你!

【问题讨论】:

    标签: r list dplyr


    【解决方案1】:

    您可以使用嵌套数据框(或根据您的首选术语列出列)来解决此问题。

    下面的代码是如何使用 mutate 和 map 执行此操作的通用示例,它将创建嵌套数据框,然后取消嵌套:

    f <- function(x){
      tibble(y = x* 2, z = x*3)
    }
    
    tib <- tibble(x = rep(100:120)) %>% 
      mutate(data = map(x, f)) %>% 
      unnest()
    tib
    

    【讨论】:

    • 谢谢!我仍然需要研究 map() 的工作原理,然后让它看起来像 purrr 包的简单应用程序。
    • 如果您经常遇到这种问题,那么使用 purrr 的地图函数和嵌套数据框绝对值得学习
    猜你喜欢
    • 1970-01-01
    • 2020-05-04
    • 2019-03-29
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多