【问题标题】:R loop over a function argument to add variables to data frameR循环遍历函数参数以将变量添加到数据框
【发布时间】:2021-06-18 08:09:34
【问题描述】:

我是 R 新手,经过数小时尝试和搜索类似问题的答案后,我仍然无法弄清楚如何在整数 n 上循环以下代码,而不是为每个 n 编写一行。

d <- data.frame(s = seq(0, 0.125, 0.001))
f <- function(n, s, x) {
    (1 - 2*sqrt(2*s) + x)^(n - 1)*(1 - 2*sqrt(2*s) + (1 + n)*x) - 1)
}

d <- d %>% 
    mutate(p_2 = mapply(function(n,s) uniroot(f, interval = c(0,1),n=n,s=s)$root,n=2,d$s),
           p_3 = mapply(function(n,s) uniroot(f, interval = c(0,1),n=n,s=s)$root,n=3,d$s),
           p_4 = mapply(function(n,s) uniroot(f, interval = c(0,1),n=n,s=s)$root,n=4,d$s),
           p_5 = mapply(function(n,s) uniroot(f, interval = c(0,1),n=n,s=s)$root,n=5,d$s))

以下确实重复打印我试图添加到我的数据框 d 的变量,

for (i in c(2:10)){
mapply(function(n,s) uniroot(f, interval = c(0,1),n=n,s=s)$root,n=i,d$s) %>% print()
}

但是当我尝试在循环中将其与 mutate 函数一起使用时,只有一个名为“p_i”的新变量被添加到数据框中,该变量采用“p_10”的值:

for (i in 2:10){
    d <- d %>% mutate(p_i = mapply(function(n,s) uniroot(f, interval = c(0,1),n=n,s=s)$root,n=i,d$s))
}

如何让 R 循环遍历 n 并为每次迭代附加一个新变量?如果我遗漏了一个明显的错误,或者根本不需要使用 for 循环来完成这项工作,我深表歉意。任何帮助将不胜感激。

【问题讨论】:

    标签: r loops dplyr mapply


    【解决方案1】:

    您可以在基础 R 中简单地做到这一点。无需使用 mutate 使事情复杂化

    for (i in c(2:10)){
      d[[paste0('p_', i)]] = 
        mapply(function(n,s) uniroot(f, interval = c(0,1),n=n,s=s)$root,n=i,d$s) 
    }
    

    注意,如果你真的想使用 dplyr,那么你可以结合!!:= 来达到想要的效果。但我发现基础 R 更加整洁和简单。

    for (i in 2:10){
      d <- d %>% mutate(!!paste0('p_', i) := 
                          mapply(function(n,s) uniroot(f, interval = c(0,1),n=n,s=s)$root,n=i,d$s))
    }
    

    【讨论】:

    • 非常感谢,这太棒了!
    猜你喜欢
    • 2018-03-07
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多