Stata 使用循环替换变量的值

Stata 使用循环替换变量的值,stata,Stata,我试图在我的数据集中创建一个新变量来存储一个数字,这个数字是从对同一观测值的另一个数字的计算中得到的 * Here is what my dataset looks like: SubjectID Score MyNewScore 1001 5442822 0 1002 6406134 0 1003 16 0 现在,变量Score是多达23个不同数字的总和(我称之为“响应”),范围从1到8388608 /* E

我试图在我的数据集中创建一个新变量来存储一个数字,这个数字是从对同一观测值的另一个数字的计算中得到的

* Here is what my dataset looks like:
SubjectID    Score     MyNewScore
1001         5442822   0
1002         6406134   0
1003         16        0
现在,变量
Score
是多达23个不同数字的总和(我称之为“响应”),范围从1到8388608

/* Example of response values
1st response = 1
2nd response = 2
3rd response = 4
4th response = 8
5th response = 16
6th response = 32
...
23rd response = 8,388,608
*/
MyNewScore
包含用于获取
Score
中的值的这些不同响应的计数。在我的示例数据集中,
MyNewScore
应该等于9,因为有9个响应用于得到5442822的总和

我已将
forvalues
循环嵌套在成功计算
MyNewScore
的Stata中的
while
循环中,但我不知道如何用嵌套循环的结果替换数据集中当前存在的0

用于计算我追求的值的Stata代码:

// Build a loop to create a Roland Morris Score
local score = 16
local count = 0

while `score' != 0 {

    local ItemCode
        forvalues i=1/24
            local j = 2^(`i' - 1)
            if `j' >= `score' continue, break
            local ItemCode `j'
        *   display "`ItemCode'"
        }

    local score = `score' - `ItemCode'
    if `score' > 1 {
        local count = `count' + 1
        display "`count'"
    }
    else if `score' == 1 {
        local count = `count' + 1
        display "`count'"
        continue, break
    }
}

如何用嵌套循环的输出替换
MyNewScore
中的0?我尝试过用一个“replace”命令将这两个循环嵌套在另一个
while
循环中,尽管这只是将第一个观察值的计数应用于数据集中的所有观察值

我认为您需要做的就是将代码嵌套在循环中,循环通过数据集中的每个变量,如下所示:

// get total number of observations in dataset
local N = _N 

// go through each observation and run the while loop
forvalues observation = 1/`N' {
    local score = Score[`observation']
    local count = 0

    // your while loop here
    while `score' != 0 {
        ...
    }

    replace MyNewScore = `ItemCode' in `observation' // (or whatever value you're after)
}

这就是你想要的吗?

我认为第23个响应的值有错误,应该是
2^(23-1)
,即4194304

前4个回答的总和为15;这是
1+2+4+8
2^4-1
。所有23个回答的总和为
2^23-1
,因此得分的最大可能值为8388607

这里不需要循环观测。从分数变量的克隆副本开始。您循环每个响应,从最高值到1。每次通过时,如果当前分数高于或等于响应值,则计算该响应并从分数中减去该值

* Example generated by -dataex-. To install: ssc install dataex
clear
input long(SubjectID Score)
1001 5442822
1002 6406134
1003      16
1004       1
1005      19
1006      15
1007 8388607
end

clonevar x = Score
gen wanted = 0
qui forvalues i=23(-1)1 {
    local response = 2^(`i'-1)
    replace wanted = wanted + 1 if x >= `response'
    replace x = x - `response' if x >= `response'
}

我会尽快试用,并让你知道。谢谢我收到一个“无效语法”错误。我将继续检查我的代码,看看是否能找到错误。我可能需要在周一用修订后的代码更新我的帖子。感谢您迄今为止的帮助!我的错误,我在上面的代码中犯了一个错误,我现在已经成功地修复了“无效语法”“错误仍然存在。我相信你的代码是好的,错误在于我写的东西。谢谢你的回复!关于这个错误你是对的,尽管那是我的错别字。实际上有24个响应,所以我应该键入
2^(24-1)
。我已尝试了您的解决方案,但在
forvalues
行中出现了“类型不匹配”错误。另外,您能解释一下
(-1)1
语法的作用吗?纠正了“类型不匹配”错误。由于缺少值,该列是字符数据。我通过使用
需要的销毁、替换强制力
进行更正,然后应用您的解决方案。它工作得很好!非常感谢。