根据功能创建数据框列
Create column of data frames based on function
我想将 map
函数与 tidyverse
一起使用,以根据来自原始数据的一些(但不是全部)列的参数创建一列数据框 frame/tibble.
我希望能够使用 map
函数,这样我就可以将其替换为 future_map
以利用并行计算。
除此解决方案 not 使用 map
外,此解决方案产生正确的最终结果(另请参阅此问答:):
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)))
这些运行,但是第四列不是数据框,正如我所期望的那样。
我们可以使用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
我想将 map
函数与 tidyverse
一起使用,以根据来自原始数据的一些(但不是全部)列的参数创建一列数据框 frame/tibble.
我希望能够使用 map
函数,这样我就可以将其替换为 future_map
以利用并行计算。
除此解决方案 not 使用 map
外,此解决方案产生正确的最终结果(另请参阅此问答:
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)))
这些运行,但是第四列不是数据框,正如我所期望的那样。
我们可以使用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