R循环函数参数以将变量添加到数据框
R loop over a function argument to add variables to data frame
我是 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 循环来完成这项工作,我深表歉意。任何帮助将不胜感激。
您可以在 base 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,那么您可以结合使用!!
和:=
来获得想要的结果。但我发现 base 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))
}
我是 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 循环来完成这项工作,我深表歉意。任何帮助将不胜感激。
您可以在 base 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,那么您可以结合使用!!
和:=
来获得想要的结果。但我发现 base 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))
}