R 中的自定义函数使用 pmap_int

Custom function in R using pmap_int

在 R 中,我创建了一个函数来重复给定不同输入参数的一系列计算。 我正在尝试使用 pmap_int() 来传递参数并从我的函数中获取结果。示例:

unique_id = seq(1:5)
pos = seq(1.1,1.5, by =  0.1)
cpc = seq(11:15)
clicks = seq(30,50, by =5)
times = seq(2,10, by =2)
df<-data.frame(unique_id,pos,cpc,clicks, times)

myfunction<-function(n_clicks, position, weighted_cpc){
 t<- df %>% 
 filter(clicks/times>n_clicks & pos<position & cpc>weighted_cpc) %>%
 summarise(n_kwd = length(unique_id)) 
 return(t)  
 }

test <- tibble(
 n_clicks = rep(c(0,10), each = 6),
 position = rep(seq(1.1,1.3,by= 0.1),4),
 weighted_cpc = rep(seq(0.10,0.20, by= 0.1),6))


test %>% 
  pmap_int(n_clicks,position,weighted_cpc, myfunction)

这 returns 一个错误:"Error: Result 1 is not a length 1 atomic vector"。 但是,如果我将 tibble 的每个元素单独传递给 myfunction,它会给出所需的结果。例如:

myfunction(test$n_clicks[1],test$position[1],test$weighted_cpc[1])

你知道发生了什么事吗?我认为这可能是函数返回结果的方式,但我可以找到修复它的方法。谢谢!

我不知道为什么这不起作用,但可以使用以下代码修复:

test %>% 
  pmap(myfunction) %>% 
  unlist()
n_kwd n_kwd n_kwd n_kwd n_kwd n_kwd n_kwd n_kwd n_kwd n_kwd n_kwd n_kwd 
    0     1     2     0     1     2     0     1     1     0     1     1 

您没有正确地向 pmap_int 传递参数。检查文档。它需要一个列表作为第一个参数(或 tibble),一个函数作为第二个。它不期望列名。调用应该看起来更像

test %>% 
  pmap_int(myfunction)

如果您尝试使用列名,则需要在某种类型的 mutate

中执行此操作
test %>% rowwise() %>%
  mutate(z=myfunction(n_clicks, position, weighted_cpc))

这里我使用了rowwise(),因为你的函数没有向量化。这也将 return 添加了新列,而不是以前的版本 return 只是值。

此外,如果您使用 _int 版本,您的自定义函数应该 return 一个整数。你似乎在 return 小题大做。你的函数应该看起来像

myfunction <- function(n_clicks, position, weighted_cpc){
  df %>% 
    filter(clicks/times>n_clicks & pos<position & cpc>weighted_cpc) %>%
    summarise(n_kwd = length(unique_id)) %>%
    pull(n_kwd)
}