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)
}
在 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)
}