【问题标题】:Create column of data frames based on function根据函数创建数据框列
【发布时间】:2021-11-11 19:05:01
【问题描述】:

我想将map 函数与tidyverse 结合使用,根据原始数据框/tibble 的部分(但不是全部)列的参数创建一列数据框。

我希望能够使用 map 函数,以便我可以将其替换为 future_map 以利用并行计算。

除了这个解决方案使用map,这个解决方案会产生正确的最终结果(另见这个问题和答案:How to use rowwise to create a list column based on a function):

library(tidyverse)
library(purrr)

df <- data.frame(a= c(1,2,3), b=c(2,3,4), c=c(6,5,8))

fun <- function(q,y) {
    r <- data.frame(col1 = c(q+y, q, q, y), col2 = c(q,q,q,y))
    r
}

result1 <- df %>% rowwise(a) %>% mutate(list1 = list(fun(a, b)))

> result1
# A tibble: 3 × 4
# Rowwise:  a
      a     b     c list1       
  <dbl> <dbl> <dbl> <list>      
1     1     2     6 <df [4 × 2]>
2     2     3     5 <df [4 × 2]>
3     3     4     8 <df [4 × 2]>

我该如何使用map 来代替?以下是三个错误的尝试:

不正确的尝试 1:

wrong1 <- df %>% mutate(list1 = map(list(a,b), fun))

不正确的尝试 2:

wrong2 <- df %>% mutate(list1 = map(c(a,b), fun))

不正确的尝试 2:

wrong3 <- df %>% mutate(list1 = list(map(list(a,b), fun)))

我得到的错误是x argument "y" is missing, with no default。而且我不确定如何将多个参数传递给这样的情况。

我想要一个有多个参数的解决方案,但如果这不可能,让我们转到一个有一个参数的函数。

fun_one_arg <- function(q) {
    r <- data.frame(col1 = c(q, q, q, q+q), col2 = c(3*q,q,q,q/2))
    r
}

wrong4 <- df %>% mutate(list1 = map(a, fun_one_arg))
wrong5 <- df %>% mutate(list1 = list(map(a, fun_one_arg)))

这些运行,但第四列不是数据框,如我所料。

【问题讨论】:

    标签: r tidyverse purrr


    【解决方案1】:

    我们可以使用map2,因为有两个参数

    library(dplyr)
    df %>%
        mutate(list1 = map2(a, b, fun)) %>%
        as_tibble
    # A tibble: 3 x 4
          a     b     c list1       
      <dbl> <dbl> <dbl> <list>      
    1     1     2     6 <df [4 × 2]>
    2     2     3     5 <df [4 × 2]>
    3     3     4     8 <df [4 × 2]>
    

    或者另一个选项是pmap,它也可以占用超过 2 列。 ..1..2代表列顺序相同

    df %>%
        mutate(list1 = pmap(across(c(a, b)), ~ fun(..1, ..2))) %>%
        as_tibble
    

    【讨论】:

    • 您过去肯定回答过重复的问题。
    • 谢谢!如果您不介意,有几个问题:对于第一个解决方案,为什么list 显示为(第一行)3, 1, 1, 2, 1, 1, 1, 2 而不是&lt;df [4 × 2]&gt; 就像rowwise 解决方案中的那样?对于第二个解决方案,我收到错误:Error: Problem with mutate()` 列list1。 ℹlist1 = pmap(across(c(a, b)), fun)。 x 未使用的参数 (a = .l[[1]][[i]], b = .l[[2]][[i]])`
    • @bill999 df 输入是一个data.frame,因此它返回一个data.frame。在rowwise 中,添加属性并创建tibble
    • 我更新了帖子。现在它们都给出了相同的输出
    猜你喜欢
    • 2017-01-03
    • 2021-11-04
    • 2019-08-06
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多