gpt4 book ai didi

r - 通过使用 tidyverse 改变参数来调用相同的函数并应用族函数

转载 作者:行者123 更新时间:2023-12-04 03:42:53 27 4
gpt4 key购买 nike

这是我在 Stack Overflow 上的第一个问题,所以如果我不够清楚,我提前道歉。我搜索了类似的问题,但没有找到任何内容(我可能搜索不够!)

给定一个 data.frame(或 data.tabletibble),包含分为两组的四组点:

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 函数,使用不同的 bwfromto"o1""o2" 组。

我想用 tidyverseR-base-data.table 方法以优雅的方式解决这个问题( 应用 族函数)。

现在我已经设法通过 tidyverse 做到了这一点:

  1. 我定义了一个 common_dens 函数,它应用 density 并返回 xy 的小标题> 分布

    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)
    }
  2. 假设 upper、lower 和 bws 的值如下:

    lower <- c(-5.050, -4.705)
    upper <- c(6.445, 9.070)
    bws <- c(0.1427, 0.1417)

    我通过以下 for 循环获得所需的数据帧:

    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 函数允许您将任意数量的参数连续应用于一个函数。 pmap_dfr 返回由行绑定(bind)的 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))))

你当然可以对 base R apply 做同样的事情:

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

关于r - 通过使用 tidyverse 改变参数来调用相同的函数并应用族函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65656893/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com