【发布时间】:2021-01-28 00:56:13
【问题描述】:
我想编写一个条件函数来应用到我的数据框。
现有的功能是:
Proposed <- function(N_b,N_l,m,A,x.sqr,e_1,e_2,e_3,e_4,e_5,K_g,a,b,c,d) {
e <- data.frame(e_1,e_2,e_3,e_4,e_5,N_l)
ee <- e[e != 0]
CSi <- m * ((N_l/N_b) * ((a*K_g)^b) +
((A * apply(ee,1,function(v) max(combn(v[1:ncol(ee)],v["N_l"],sum))))
/ x.sqr) * ((c*K_g)^d))
return(CSi)
}
条件有两个方面:
我想添加条件,如果A > 0 然后选择max(combn(v[1:5],v["N_l"],sum))。但是如果A < 0选择min(combn(v[1:5],v["N_l"],sum))
数据
提供了一个示例数据框(只有几行)
dput(DATA)
structure(list(N_l = c(2, 4, 2, 4, 1, 2, 1, 3), N_b = c(5, 5,
5, 5, 5, 5, 5, 5), m = c(1, 0.65, 1, 0.65, 1.2, 1, 1.2, 0.85),
A = c(-12, -12, -15, -15, -9, -9, -9, -9), x.sqr = c(1440,
1440, 2250, 2250, 810, 810, 810, 810), e_1 = c(21.8, 21.8,
29, 29, 14.6, 14.6, 14.6, 14.6), e_2 = c(9.8, 9.8, 17, 17,
2.6, 2.6, 2.6, 2.6), e_3 = c(-2.2, -2.2, 5, 5, -9.4, -9.4,
-9.4, -9.4), e_4 = c(-14.2, -14.2, -7, -7, 0, 0, 0, 0), e_5 = c(0,
0, -19, -19, 0, 0, 0, 0), K_g = c(6340598.65753794, 6340598.65753794,
6429472.98493414, 6429472.98493414, 6296482.86883766, 6296482.86883766,
8140521.8248051, 8140521.8248051)), row.names = c(20L, 40L,
60L, 80L, 100L, 120L, 140L, 160L), class = "data.frame")
【问题讨论】:
-
为什么要创建
data.frame?如果您的值都是数字,那么matrix会快得多,并且您的第二行e[e != 0]创建一个向量,它是您的框架的列优先未列出的向量。正因为如此,ee没有维度,所以apply(ee, 1, ...)没有意义(应该是Error)。您可能需要提供示例数据和预期输出才能帮助解决此问题。 -
这对我来说似乎很简单。您是否尝试过使用 if 语句?如果是这样,为什么它不起作用?
-
@r2evans 对于某些行,某些 E_1、E_2 等列的项为零。我不想在
combn函数的考虑中包含does。我只去了一个data.frame,因为这是我在combn使用示例中看到的示例。 -
@r2evans 我上传了一个示例数据框
-
@LucasDeAbreuMaia 我遇到了一个错误,我认为 r2evans 指的是这个错误。使用
nls应用它的错误是 Error in apply(ee, 1, function(v) min(combn(v[1:ncol(ee)], v["N_l"], sum))) : dim( X) 必须具有正长度
标签: r function dataframe conditional-statements