Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用purrr在R中获得中间结果和最终结果_R_Purrr - Fatal编程技术网

如何使用purrr在R中获得中间结果和最终结果

如何使用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

当使用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.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)