【问题标题】:Creating a Table Using Previous Values (Iterative Process)使用以前的值创建表(迭代过程)
【发布时间】:2021-05-05 02:04:34
【问题描述】:

我是 Visual FoxPro (9.0) 的新手,在创建使用以前的值生成新值的表时遇到了麻烦。我的意思是我有一个给定的表格,它有两列,年龄和死亡概率。使用它,我需要创建一个生存表,其中包含 Age、l(x)、d(x)、q(x)、m(x)、L(x)、T(x) 和 q(x) 列地点:

  • l(x):生存函数;定义为 l(x+1) = l(x) * EXP(-m(x))
  • d(x):死亡人数;定义为 l(x) - l(x+1)
  • q(x):死亡概率;这个已经给我了
  • m(x):死亡率;定义为-LN(1-q(x))
  • L(x): 区间 (x, x+1) 中的队列人-年总数;定义为 l(x+1) + (0.5 * d(x))
  • T(X):区间 (x, N) 中所有群组的总人年;定义为 SUM(L(x)) [From x, N]
  • e(x):剩余预期寿命;定义为 T(x) / l(x)

现在我不是在问如何获得所有这些值,我只是需要帮助开始并指出正确的方向。据我所知,在 VFP 中没有办法指向数据表中的特定行,所以我不能做我通常在 R 中做的事情,而只是做一个循环。 IE。我不能这样做:

for (i in 1:length(given_table$Age))
  {
  new_table$mort_rate[i] <- -LN(1-given_table$death_prop[i])
  }

已经有一段时间了,所以我不确定这是否 100% 正确,但我的观点是我习惯于创建一个表,并通过指向特定行和/或单独更改值使用带有简单计数器变量的循环的列。但是,从我读到的内容看来,在 VFP 中似乎没有办法做到这一点,我完全迷路了。

我尝试制作一个光标,用虚拟值填充它,并尝试使用 SCATTER NAME 和 SCAN/REPLACE 事物顺序更新每个值,但我真的不明白发生了什么或如何微调每个我需要的计算/输入。 (这是我尝试此操作时引用的帖子:Multiply and subtract values in previous row for new row in FoxPro

那么,如何在 Visual FoxPro 中制作一个依赖迭代过程来计算后续值的表?有没有什么好的资源可以解释我正在尝试的光标和分散/扫描的东西(我找不到任何资源可以用我能理解的方式解释它)?

对不起,如果我措辞不好,我对编程还是很陌生。谢谢。

【问题讨论】:

  • 我建议您在提出问题时包含样本数据和所需结果。
  • VFP 当然有办法随时指向特定的行。同样在 VFP 中,可以将整个表视为一个数组,并为不同行的数据使用数组指针。还有 SQL 和 Scan...endscan。您的问题中缺少一些示例数据以及您真正想要的数据。

标签: sql visual-foxpro database-cursor


【解决方案1】:

您绝对可以通过 VFP 中的现有表编写循环。使用扫描命令。但是,如果您打算将记录添加到同一个表中,您将遇到一些问题。这就是你在这里的意思吗?如果是这样,我的建议是在创建新记录时将它们放入游标中,然后在处理完开始时存在的所有记录后将它们附加到原始表中。

如果您在遍历原始表时将记录放入不同的表中,这很简单:

* Assumes you've already created the table or cursor to hold the result
SELECT YourOriginalTable && substitute in the alias/name for the original table
SCAN
  * Do your calculations
  * Substitute appropriately for YourNewTable and the two lists
  INSERT INTO YourNewTable (<list of fields>) VALUES (<list of values>)
ENDSCAN

在 INSERT 命令中,如果引用原始表的任何字段,则需要给它们起别名,如下所示:YourOriginalTable.YourField,再次适当地替换。

【讨论】:

    【解决方案2】:

    有点晚了,但也许仍然有帮助。 实现您想要的步骤是: 0. 关闭表 - 以防万一(参见关闭数据库)

    1. 打开年龄表(请参阅 VFP 帮助中的 USE)
    2. 创建 Survival 表结构(请参阅 CREATE TABLE) 为此,您需要知道每个 l(x)、d(x) 等函数的字段类型 假设您将字段命名为函数(即 Lx、Dx 等)
    3. 选择 Age 表(参见 SELECT)
    4. 遍历年龄表(请参阅 SCAN)
    5. 将每条记录传递到变量中(参见 SCATTER)
    6. 使用 L(x)、D(x) 等公式从年龄表数据(变量)开始计算并将其存储到名为 M 的变量中。您的生存表字段M.mx = -LOG(1-m.Age) &amp;&amp; see LOG 注意:在这些计算中,您可以使用 Age 表变量和新创建的变量的任意组合。
    7. 从 Survival 计算所有字段后,将其写入表中(请参阅 APPEND && GATHER 命令)
    8. 关闭表(参见关闭数据库)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 2019-05-19
      • 1970-01-01
      • 2015-07-23
      相关资源
      最近更新 更多