【问题标题】:R equivalent of performing operations on an empty list in Python?R相当于在Python中对空列表执行操作?
【发布时间】:2021-12-02 14:31:21
【问题描述】:

我一直在尝试将 python 中的代码复制到 R 等效项,但遇到了一些麻烦。我正在尝试将向量添加到一个空列表中,这似乎可以在 python 中轻松完成,但在 R 中找到正确的空列表具有挑战性。

我认为 R 等效项的问题是确定 S1 的正确空列表,其向量长度与 PE 相同,因为 python 似乎没有压力。我曾尝试使用vector()rep() 函数并指定所需的731 长度,但R 不会让我对其执行任何操作,错误消息是正确的Error in S1[i - 1] + DS : non-numeric argument to binary operator。在这方面是否有一种简单的方法可以使空列表数字化?

请注意,所描绘的 PE 对应于长度为 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]] &lt;- c(1,2,3)),但然后你写“我认为R等效的问题是确定S1的正确空列表,其向量长度与P和E相同”关于我不明白你在问什么......我建议重新表述这个问题
  • @dario OP 似乎在询问如何逐步增长向量/列表,正如 Python list 对象的惯用语,您在其中 .append 对它们。通常,在 R 中,您不这样做,而是预先分配给给定的大小,或者使用向量化操作来创建新的列表/向量,例如 Python 库 pandasnumpy
  • 请注意,R 代码和 Python 代码都没有一个,而是多个代码质量问题(太多,无法在评论中列出)。

标签: python r list


【解决方案1】:

R 中 Python S1 = []; S1.append(x) 的等价物是 R 中的 S1 &lt;- list(); S1 &lt;- c(S1, list(x))

在您的示例中,c(S1, x) 将起作用,因为您尝试附加的数值将自动包装在列表中,但明确执行此操作更安全。如果x 已经是一个列表,那么c(S1, x) 会将其元素附加到S1,而c(S1, list(x)) 会将包含x 副本的单个条目附加到S1

您可以在 R 中使用 append() 函数,但请记住,R 函数很少修改其参数,因此您可以编写

S1 <- append(S1, list(x))

在这种情况下,它与c() 基本相同。

【讨论】:

  • append 无论如何用词不当:它应该被称为insert,因为它就是这样做的;默认情况下,它插入元素的索引位于末尾。在这种情况下,它的作用完全等同于c()(尽管效率较低),就像你说的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
相关资源
最近更新 更多