【发布时间】:2020-07-15 22:20:59
【问题描述】:
我正在尝试为 df 的每一行计算函数 EX_A0 的值并将其添加为新列,但我得到“更长的对象长度不是更短的对象长度的倍数”错误。当我过滤掉一行并只为一行做时,没有错误。两行的 EX_A0 的结果都是数字,并且只有一维。我不明白为什么我会收到这个错误。我会很感激你的帮助。这是我的代码:
EQ_A0 <- function(S_a, lambda_a, c){
integrate(integrand2, 0, 30, S_a, lambda_a, c, subdivisions=2000, rel.tol=.Machine$double.eps^.05)$value
}
integrand2 <- function(tau, S_a, lambda_a, c){
exp(log(tau)+h_A0(tau, S_a, lambda_a, c))
}
h_A0 <- function(tau, S_a, lambda_a, c){
dgamma(tau, shape=S_a, scale = lambda_a*c, log = TRUE) - pgamma(30, shape=S_a, scale = lambda_a*c, lower.tail = TRUE, log.p=TRUE)
}
df <- data.frame(cc=c(0.06329820, 0.05141647), ya=c(31, 256), Sa=c(31,256), yb=c(2865, 742), Sb=c(2993, 1348))
df %>%
mutate(asd=EQ_A0(Sa, 350, cc))
以下工作,但我仍然不明白为什么 mutate 不起作用。
mapply(EQ_A0, df$Sa, lambda_a, df$cc)
cbind(df,f = mapply(EQ_A0, df$Sa, 350, df$cc) )
【问题讨论】:
-
你能描述一下你对 EQ_A0 使用了什么函数吗?您已显示 EX_A0。
-
对不起,我刚刚更正了。
-
变异有效。这不是错误,只是警告。出现警告是因为
length(dgamma(tau, shape=S_a, scale = lambda_a*c, log = TRUE))是21而length(pgamma(T, shape=S_a, scale = lambda_a*c, lower.tail = TRUE, log.p=TRUE))是2。在pgamma中使用T(RUE)作为参数的原因是什么?你的意思是tau? -
T 实际上是 30,我忘了补充。
标签: r function error-handling dplyr integral