【发布时间】:2016-08-25 11:56:29
【问题描述】:
我真的很难创建一个运行模型的函数,其中所有变量 a、b、d、g 和 N 都有多个版本,如下面的 data.table 所示我已经命名为crm:
crm = data.table(
East = 26500,
North = c(115000, 120000, 125000, 130000, 135000, 140000),
rain = c(1049.61, 1114.31, 1361.61, 1407.2, 1499.56, 1654.13),
crop = 'Wheat', area = c(0.1718, 0.1629, 0.1082, 0.0494, 0.02, 0.004),
rn = c("10007", "10018", "10023", "10024", "10025", "10026"),
N1 = 184.262648839489, N2 = 180.312874871521, N3 = 178.615847839997,
N4 = 182.531626054579, a1 = 0.186117715072018, a2 = -0.0232731908915799,
a3 = 0.227017532149122, a4 = 0.162943230565506, b1 = 0.000478900233700419,
b2 = 0.000787931973696371, b3 = 0.000458478256537521, b4 = 0.000517304324750896,
d1 = -0.000328164576390286, d2 = -0.000112122093240884, d3 = 0.000112702113716146,
d4 = 7.40875908059628e-05, g1 = 4.04709473710477e-06, g2 = 3.68724096485995e-06,
g3 = 3.47214450131546e-06, g4 = 3.55825543257538e-06, key = 'rn'
)
我要做的是运行下面的函数来计算lnN 的值,并将其放入标题中与输入模型的变量具有相同数字的列中。 IE。使用 a1,b1,d1,g1 & N1 将为所有 2s、3s 和 4s 生成列 lnN1 等等。
n <- 1:4
cols <- paste0("lnN",n)
for(i in 1:length(n)){
crm[,(cols) := lapply(.SD ,function (x) {
N = crm[,7+i]
a = crm[,11+i]
b = crm[,15+i]
d = crm[,19+i]
g = crm[,23+i]
a + (b*crm[,rain]) + (g*N) + (d*crm[,rain]*N)}), .SDcols = paste0("N",n)]
}
我还没有在任何地方找到有关如何完成此操作的示例。我试过使用mapply,但我看不到如何通过每个变量的所有迭代来迭代mapply。感谢您的帮助!
【问题讨论】:
-
“我还没有在任何地方找到一个例子来说明如何做到这一点。”在这种情况下,我认为这暗示您的数据结构存在缺陷。我发现很难理解您正在尝试什么,因为您覆盖了
(cols) :=四次,这看起来不是一件有用的事情。无论如何,我会从melt(crm, meas=patterns("^N", "^a", "^b", "^d", "^g"), value.name=c("N","a","b","d","g"))开始,然后找到一种从那里开始工作的方法,而不是摆弄列号,我认为(?)你在这里做什么。 -
@Frank 感谢您的建议。我想不出其他方法来构造我的数据,因为我需要为每个变量生成多元数据作为蒙特卡洛方法的一部分以获得不确定值。我会看看你的建议,看看我能做些什么。
-
我会支持@Frank 所说的,在您迭代分析时考虑(但
"^N"可能类似于"^N[0-9]"以避免拿起North)。完成后,您可以通过dd[, lnN:=.(a + (b*rain) + (g*N) + (d*rain*N))]应用您的公式,并根据需要使用group_by继续您的分析。
标签: r for-loop data.table apply