如何使用purrr在R中获得中间结果和最终结果
当使用purr(例如map()时,我对保留purrr函数的中间结果和最终结果感兴趣。考虑下面的映射函数:如何使用purrr在R中获得中间结果和最终结果,r,purrr,R,Purrr,当使用purr(例如map()时,我对保留purrr函数的中间结果和最终结果感兴趣。考虑下面的映射函数: library(tidyverse) library(purrr) library(dplyr) list <- c(4, 8, 12, 16) test <- map(list, function(x){ if (x > 14) { min <- 0.005 } else if (x > 10) { min <- 0.02
library(tidyverse)
library(purrr)
library(dplyr)
list <- c(4, 8, 12, 16)
test <- map(list, function(x){
if (x > 14) {
min <- 0.005
} else if (x > 10) {
min <- 0.025
} else if (x >= 5) {
min <- 0.05
} else {
min <- 0.1
}
avg <- 1/x
max <- avg + (avg - min)
DF <- (seq(max, min, length.out = x))
})
我想知道如何在“测试”列表以及整体结果中包括这些最小值、平均值和最大值。在我的研究中,我认为walk()可以提供我所需要的,但它毕竟不是我想要的。是否有任何类似于map的purrr函数,或者安全地,我可以在其中指定要包含在结果中的中间结果列表?也许是变异和地图的结合
非常感谢 要在注释上展开一点,如果希望从单个函数中得到多个结果,可以返回结果列表。在您的情况下,这意味着修改函数以
返回包含感兴趣的值的列表
由于您正在使用map
对输入向量应用此函数,因此结果将是一个列表列表。四个列表(lst中每个值对应一个列表),每个列表由一个值列表组成(这里我返回x
,min
,max
,avg
和DF
)
您还可以命名您的列表,以便更容易跟踪。在这里,我使用setNames
来命名return
调用之前的列表元素
library(purrr)
lst <- c(4, 8, 12, 16)
map(lst, function(x){
if (x > 14) {
min <- 0.005
} else if (x > 10) {
min <- 0.025
} else if (x >= 5) {
min <- 0.05
} else {
min <- 0.1
}
avg <- 1/x
max <- avg + (avg - min)
DF <- (seq(max, min, length.out = x))
results <- setNames(list(x, min,max,avg,DF), c('x','min', 'max', 'avg', 'DF'))
return(results)
})
#-----
[[1]]
[[1]]$x
[1] 4
[[1]]$min
[1] 0.1
[[1]]$max
[1] 0.4
[[1]]$avg
[1] 0.25
[[1]]$DF
[1] 0.4 0.3 0.2 0.1
[[2]]
[[2]]$x
[1] 8
...
库(purrr)
第一阶段(14){
最小值(10){
最小值=5){
min要在注释上展开一点,如果您想从单个函数中得到多个结果,可以返回一个结果列表。在您的情况下,这意味着将函数修改为返回一个包含感兴趣的值的列表
因为您正在使用map
对输入向量应用此函数,结果将是一个列表。四个列表(lst
中的每个值一个)都由一个值列表组成(这里我返回x
,min
,max
,avg
和DF
)
您还可以命名列表,以便更容易跟踪。在这里,我使用setNames
在return
调用之前命名列表中的元素
library(purrr)
lst <- c(4, 8, 12, 16)
map(lst, function(x){
if (x > 14) {
min <- 0.005
} else if (x > 10) {
min <- 0.025
} else if (x >= 5) {
min <- 0.05
} else {
min <- 0.1
}
avg <- 1/x
max <- avg + (avg - min)
DF <- (seq(max, min, length.out = x))
results <- setNames(list(x, min,max,avg,DF), c('x','min', 'max', 'avg', 'DF'))
return(results)
})
#-----
[[1]]
[[1]]$x
[1] 4
[[1]]$min
[1] 0.1
[[1]]$max
[1] 0.4
[[1]]$avg
[1] 0.25
[[1]]$DF
[1] 0.4 0.3 0.2 0.1
[[2]]
[[2]]$x
[1] 8
...
库(purrr)
第一阶段(14){
最小值(10){
最小值=5){
min您混淆了R中的列表和向量。这让我怀疑您可能有Python背景。c(4,8,12,16)
是R中的向量,只包含一维数据数组。list(4,6,12,16)
是列表,可以包含多个维度(在本例中,它只有一个维度)
对于您的问题,我们可以通过定义list(min=min,avg=avg,…)
返回列表,然后返回该列表
然而,在dplyr中,也有一种不用map语句的方法,即使用带有DF嵌套列表的dataframe。dataframe只是一种特殊类型的列结构列表
library(tidyverse)
library(purrr)
library(dplyr)
vec <- c(4, 8, 12, 16)
test <- map(vec, function(x){
if (x > 14) {
min <- 0.005
} else if (x > 10) {
min <- 0.025
} else if (x >= 5) {
min <- 0.05
} else {
min <- 0.1
}
avg <- 1/x
max <- avg + (avg - min)
DF <- (seq(max, min, length.out = x))
return(list(min = min, avg = avg, max = max, DF = DF))
})
# To see the result for the first value in the list aka 4
test[[1]]
# $`min`
# [1] 0.1
#
# $avg
# [1] 0.25
#
# $max
# [1] 0.4
#
# $DF
# [1] 0.4 0.3 0.2 0.1
# Prefered alternative:
#dplyr no map needed
df <- tibble(x = vec) %>%
mutate(
min = case_when(
x > 14 ~ .005,
x > 10 ~ .025,
x >= 5 ~ 0.05,
TRUE ~ 0.1
),
avg = 1/x,
max = avg + (avg - min)
) %>%
rowwise() %>%
mutate(DF = list(seq(max, min, length.out = x))) %>%
ungroup()
df
# A tibble: 4 x 5
# x min avg max DF
# <dbl> <dbl> <dbl> <dbl> <list>
# 1 4 0.1 0.25 0.4 <dbl [4]>
# 2 8 0.05 0.125 0.2 <dbl [8]>
# 3 12 0.025 0.0833 0.142 <dbl [12]>
# 4 16 0.005 0.0625 0.12 <dbl [16]>
# To view DF for 4 you can do
df[[1,5]][[1]]
# or
df$DF[[1]]
# 0.4 0.3 0.2 0.1
库(tidyverse)
图书馆(purrr)
图书馆(dplyr)
vec%
解组()
df
#一个tibble:4x5
#x最小平均最大DF
#
# 1 4 0.1 0.25 0.4
# 2 8 0.05 0.125 0.2
# 3 12 0.025 0.0833 0.142
# 4 16 0.005 0.0625 0.12
#要查看4的DF,您可以执行以下操作
df[[1,5][[1]]
#或
df$df[[1]]
# 0.4 0.3 0.2 0.1
您混淆了R中的列表和向量。这让我怀疑您可能有Python背景。c(4,8,12,16)
是R中的向量,只包含一维数据数组。list(4,6,12,16)
是列表,可以包含多个维度(在本例中,它只有一个维度)
对于您的问题,我们可以通过定义list(min=min,avg=avg,…)
返回列表,然后返回该列表
然而,在dplyr中,也有一种不用map语句的方法,即使用带有DF嵌套列表的dataframe。dataframe只是一种特殊类型的列结构列表
library(tidyverse)
library(purrr)
library(dplyr)
vec <- c(4, 8, 12, 16)
test <- map(vec, function(x){
if (x > 14) {
min <- 0.005
} else if (x > 10) {
min <- 0.025
} else if (x >= 5) {
min <- 0.05
} else {
min <- 0.1
}
avg <- 1/x
max <- avg + (avg - min)
DF <- (seq(max, min, length.out = x))
return(list(min = min, avg = avg, max = max, DF = DF))
})
# To see the result for the first value in the list aka 4
test[[1]]
# $`min`
# [1] 0.1
#
# $avg
# [1] 0.25
#
# $max
# [1] 0.4
#
# $DF
# [1] 0.4 0.3 0.2 0.1
# Prefered alternative:
#dplyr no map needed
df <- tibble(x = vec) %>%
mutate(
min = case_when(
x > 14 ~ .005,
x > 10 ~ .025,
x >= 5 ~ 0.05,
TRUE ~ 0.1
),
avg = 1/x,
max = avg + (avg - min)
) %>%
rowwise() %>%
mutate(DF = list(seq(max, min, length.out = x))) %>%
ungroup()
df
# A tibble: 4 x 5
# x min avg max DF
# <dbl> <dbl> <dbl> <dbl> <list>
# 1 4 0.1 0.25 0.4 <dbl [4]>
# 2 8 0.05 0.125 0.2 <dbl [8]>
# 3 12 0.025 0.0833 0.142 <dbl [12]>
# 4 16 0.005 0.0625 0.12 <dbl [16]>
# To view DF for 4 you can do
df[[1,5]][[1]]
# or
df$DF[[1]]
# 0.4 0.3 0.2 0.1
库(tidyverse)
图书馆(purrr)
图书馆(dplyr)
vec%
解组()
df
#一个tibble:4x5
#x最小平均最大DF
#
# 1 4 0.1 0.25 0.4
# 2 8 0.05 0.125 0.2
# 3 12 0.025 0.0833 0.142
# 4 16 0.005 0.0625 0.12
#要查看4的DF,您可以执行以下操作
df[[1,5][[1]]
#或
df$df[[1]]
# 0.4 0.3 0.2 0.1
修改您的函数以返回一个包含您关心的所有值的列表,因此,我只需在末尾添加一行额外的代码来组合所有值?例如:DFtest函数的最后一行类似于列表(min、max、avg、DF)
修改您的函数以返回一个包含您关心的所有值的列表,因此,我只需在末尾添加一行额外的代码来组合所有值?例如:DFtest函数的最后一行类似于list(min,max,avg,DF)