【发布时间】:2021-12-02 14:31:21
【问题描述】:
我一直在尝试将 python 中的代码复制到 R 等效项,但遇到了一些麻烦。我正在尝试将向量添加到一个空列表中,这似乎可以在 python 中轻松完成,但在 R 中找到正确的空列表具有挑战性。
我认为 R 等效项的问题是确定 S1 的正确空列表,其向量长度与 P 和 E 相同,因为 python 似乎没有压力。我曾尝试使用vector() 和rep() 函数并指定所需的731 长度,但R 不会让我对其执行任何操作,错误消息是正确的Error in S1[i - 1] + DS : non-numeric argument to binary operator。在这方面是否有一种简单的方法可以使空列表数字化?
请注意,所描绘的 P 和 E 对应于长度为 731 的外部降雨数据(来自 CSV)。
对应的python如下所示:
A1 = float(0.134)
A2 = float(0.433)
A3 = float(0.433)
C1 = float(7)
C2 = float(70)
C3 = float(150)
S1 = []; S2 = []; S3 = []
Total_Excess = []
for i in range(1,dims[0]):
dS = P[i]-E[i]
S1_temp = max(S1[i-1]+dS,0)
S1_Excess = max(S1_temp-C1,0)
S1.append(min(S1_temp,C1))
S2_temp = max(S2[i-1]+dS,0)
S2_Excess = max(S2_temp-C2,0)
S2.append(min(S2_temp,C2))
S3_temp = max(S3[i-1]+dS,0)
S3_Excess = max(S3_temp-C3,0)
S3.append(min(S3_temp,C3))
Total_Excess.append((S1_Excess*A1)+(S2_Excess*A2)+(S3_Excess*A3))
我卡住之前写的R代码如下所示:
A1 <- 0.4
A2 <- 0.4
A3 <- 0.2
C1 <- 10
C2 <- 75
C3 <- 200
S1 <- list()
S2 <- list()
S3 <- list()
for(i in 1:nrow(df)){
DS <- P - E
S1_temp <- max(S1[i-1]+ DS, 0)
S1_excess <- max(S1_temp - C1)
append(S1, min(S1_temp,C1))
S2_temp <- max(S2[i-1]+ DS, 0)
S2_excess <- max(S1_temp - C1)
append(S2, min(S1_temp,C1))
...
第一部分运行后,我在控制台中调用S1_temp,只得到一个长度= 1 的向量,它显然应该是长度= 731。
另外,我将如何将 Total_excess 空列表附加到结果向量中,如 python 代码示例中的最后一行代码所示??
任何帮助将不胜感激。
【问题讨论】:
-
只是一个建议:现在这个问题非常令人困惑。我不清楚你在问什么。您首先说明 “我正在尝试将向量添加到空列表中,这似乎可以在 python 中轻松完成,但在 R 中找到正确的空列表具有挑战性。”很有意义(即
empty_list[[new_element]] <- c(1,2,3)),但然后你写“我认为R等效的问题是确定S1的正确空列表,其向量长度与P和E相同”关于我不明白你在问什么......我建议重新表述这个问题 -
@dario OP 似乎在询问如何逐步增长向量/列表,正如 Python
list对象的惯用语,您在其中.append对它们。通常,在 R 中,您不这样做,而是预先分配给给定的大小,或者使用向量化操作来创建新的列表/向量,例如 Python 库pandas和numpy -
请注意,R 代码和 Python 代码都没有一个,而是多个代码质量问题(太多,无法在评论中列出)。