沿向量映射并使用 purrr 函数族输出嵌套列表(或嵌套 data.frames)的 data.frame 列?
map along a vector and output a data.frame column of nested lists (or nested data.frames) using purrr family of functions?
我正在尝试映射一个向量,而输入向量的每个元素的输出本身就是一个向量。换句话说,向量的第一个元素的输出是一个向量。第二个、第三个、第四个等的输出也是一样
最小的可重现示例
library(purrr)
library(tidyverse)
set.seed(123)
input <- c(1, 2, 3)
rand <- runif(3)
data.frame(input=input) %>%
map_df(function(x) { x * rand})
# input
# <dbl>
# 1 0.288
# 2 1.58
# 3 1.23
实际 returns 每行只有一个值,而所需的输出是嵌套向量、列表或 data.frame(每行 3 个元素而不是 1 个元素是明智的)。
如何做到这一点?
一个选项是在 mutate
中使用 map
在数据框中创建一个列表。
data.frame(input=input) %>%
mutate(rand_3 = map(input, function(x) x * rand))
#------
input rand_3
1 1 0.2875775, 0.7883051, 0.4089769
2 2 0.5751550, 1.5766103, 0.8179538
3 3 0.8627326, 2.3649154, 1.2269308
您可以使用 rowwise
:
library(dplyr)
df <- data.frame(input)
df %>%
rowwise() %>%
mutate(rand_3 = list(input * rand))
# input rand_3
#1 1 0.288, 0.788, 0.409
#2 2 0.575, 1.577, 0.818
#3 3 0.863, 2.365, 1.227
或 lapply
以 R 为基数:
df$rand_3 <- lapply(df$input, `*`, rand)
我正在尝试映射一个向量,而输入向量的每个元素的输出本身就是一个向量。换句话说,向量的第一个元素的输出是一个向量。第二个、第三个、第四个等的输出也是一样
最小的可重现示例
library(purrr)
library(tidyverse)
set.seed(123)
input <- c(1, 2, 3)
rand <- runif(3)
data.frame(input=input) %>%
map_df(function(x) { x * rand})
# input
# <dbl>
# 1 0.288
# 2 1.58
# 3 1.23
实际 returns 每行只有一个值,而所需的输出是嵌套向量、列表或 data.frame(每行 3 个元素而不是 1 个元素是明智的)。
如何做到这一点?
一个选项是在 mutate
中使用 map
在数据框中创建一个列表。
data.frame(input=input) %>%
mutate(rand_3 = map(input, function(x) x * rand))
#------
input rand_3
1 1 0.2875775, 0.7883051, 0.4089769
2 2 0.5751550, 1.5766103, 0.8179538
3 3 0.8627326, 2.3649154, 1.2269308
您可以使用 rowwise
:
library(dplyr)
df <- data.frame(input)
df %>%
rowwise() %>%
mutate(rand_3 = list(input * rand))
# input rand_3
#1 1 0.288, 0.788, 0.409
#2 2 0.575, 1.577, 0.818
#3 3 0.863, 2.365, 1.227
或 lapply
以 R 为基数:
df$rand_3 <- lapply(df$input, `*`, rand)