[英]Call the same function by varying parameters with tidyverse and apply family functions
這是我在 Stack Overflow 上的第一個問題,所以如果我不夠清楚,我提前道歉。 我搜索了類似的問題,但我沒有找到任何東西(我可能搜索的不夠多!)
給定一個由四組點組成的data.frame
(或data.table
或tibble
),分為兩組:
df_points <- tibble(
x = c(rnorm(10000, mean = 0), rnorm(10000, mean = 1),
rnorm(10000, mean = 0), rnorm(10000, mean = 4)),
dist = c(rep("d1", 10000), rep("d2", 10000),
rep("d1", 10000), rep("d2", 10000)),
overlap = c(rep("o1", 20000), rep("o2", 20000))
)
我的目標是應用density
function,對"o1"
和"o2"
組使用不同的bw
、 from
和to
值。
我想用tidyverse
和R-base
以優雅的方式解決這個問題 - data.table
方法( apply
家庭功能)。
現在我已經設法通過tidyverse
做到這一點:
我定義了一個common_dens
function 應用density
並返回分布的x
和y
的小標題
common_dens <- function(df, Bw, lower, upper) { d <- density(df, n = 2048, bw = Bw, from = lower, to = upper) df_d <- tibble(x = d$x, y = d$y) return(df_d) }
假設upper、lower和bws的值如下:
lower <- c(-5.050, -4.705) upper <- c(6.445, 9.070) bws <- c(0.1427, 0.1417)
我通過以下for
循環獲得了所需的 dataframe:
df_dens <- NULL for (i in 1:2) { df_t <- df_points %>% filter(overlap == unique(df_points$overlap)[[i]]) %>% group_by(dist, overlap) %>% summarise(common_dens(x, bws[i], lower[i], upper[i])) df_dens <- rbind(df_dens, df_t) }
有什么辦法可以去掉for
循環?
有沒有辦法對apply
系列功能和data.table
做同樣的事情?
謝謝你的幫助!
purrr::pmap
function 允許您將任意數量的參數連續應用於 function。 pmap_dfr
返回按行綁定的 data.frame:
考慮作為 data.frame 提供的參數:
params <- data.frame(group = c("o1","o2"), bws, lower, upper)
group bws lower upper
1 o1 0.1427 -5.050 6.445
2 o2 0.1417 -4.705 9.070
參數會自動分配給特殊符號..1
、 ..2
等:
library(purrr)
pmap_dfr(params, ~ df_points %>%
filter(overlap == ..1) %>%
group_by(dist, overlap) %>%
summarise(common_dens(x,Bw = ..2, lower = ..3, upper = ..4)))
哪個..#
是哪個可能會讓人感到困惑,所以一個技巧是使用with(list(...), )
:
pmap_dfr(params, ~ with(list(...), df_points %>%
filter(overlap == group) %>%
group_by(dist, overlap) %>%
summarise(common_dens(x,Bw = bws, lower = lower, upper = upper))))
您當然可以對基礎 R 執行相同的操作:
apply(params, 1, function(y){ df_points %>%
filter(overlap == y[1]) %>%
group_by(dist, overlap) %>%
summarise(common_dens(x, Bw = as.numeric(y[2]), lower = as.numeric(y[2]),
upper = as.numeric(y[4])))}) %>%
bind_rows()
但是,由於apply
會轉換類型,因此您需要使用as.numeric
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.