如何使用'tidyverse'包将函数的多次返回放在一列或多列中

如何使用'tidyverse'包将函数的多次返回放在一列或多列中,r,list,dplyr,mutate,R,List,Dplyr,Mutate,这里是我的问题:我有一个函数,它接受1个double并返回几个double,我想直接在tibble的不同列上获取它们。我用mutate()和/或map()尝试了几种方法 我不想调用该方法n次,每次调用函数返回的列表的不同元素 以下是我试图做的一个一般性问题: library(tidyverse) ## a random function that return more than 1 element f <- function(x){ return(list(x/2,x**2)) }

这里是我的问题:我有一个函数,它接受1个double并返回几个double,我想直接在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]])
库(tidyverse)
##返回多个元素的随机函数

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

下面的代码是如何使用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
f%
unnest()
蒂布

谢谢!我仍然需要研究map()的工作原理,然后使它看起来像purrr包的一个简单应用程序。如果这是您经常遇到的问题,那么使用purrr的map函数和嵌套数据帧肯定是值得学习的