在Stata中使用局部变量更改变量值

在Stata中使用局部变量更改变量值,stata,Stata,我的数据集中有一个变量countrycode,它使用ISO数字代码(基本上是3个数字)来识别每个观测值来自哪个国家。但是,要与另一个数据集合并,我需要将这些国家代码更改为ISO alpha值(3个字母) 我有一个csv文件(ISOcodes.csv),它匹配数字代码和字母代码;看起来是这样的: num,name,alpha 004,Afghanistan,AFG 248,Åland Islands,ALA 008,Albania,ALB ... 以下是我尝试的解决方案: in

我的数据集中有一个变量
countrycode
,它使用ISO数字代码(基本上是3个数字)来识别每个观测值来自哪个国家。但是,要与另一个数据集合并,我需要将这些国家代码更改为ISO alpha值(3个字母)

我有一个csv文件(ISOcodes.csv),它匹配数字代码和字母代码;看起来是这样的:

num,name,alpha  
004,Afghanistan,AFG  
248,Åland Islands,ALA  
008,Albania,ALB   
...
以下是我尝试的解决方案:

insheet using ISOcodes.csv

* Create variables ISOnum_1, ISOnum_2, etc. and ISOalpha_1, ISOalpha_2, etc. 
* ISOnum_1 and ISOalpha_1 should refer to the same country
local N = _N
forvalues x = 1 (1) `N' {
    local ISOnum_`x' = num[`x']
    local ISOalpha_`x' = num[`x']
}

clear 
insheet using maindataset.csv

* Replace all numeric values in `countrycode` with the corresponding `alpha` values
recast countrycode str3
foreach x = 1 (1) `N' {
    replace countrycode = ISOalpha_`x' if countrycode == ISOnum_`x'
}

list countrycode
然而,我甚至无法创造当地人;当我运行这个程序时,当我尝试分配第一个本地变量时,就会出现错误“numnotallowed”。你知道这里出了什么问题吗?在下一节中,我应该预见到什么问题?我对斯塔塔很陌生


另外,当我清除ISOcodes.csv数据集以导入主数据集时,是否会丢失刚才分配的所有局部变量?

您不需要循环。您想使用
merge
命令。下面是一个例子:

clear

*----- example data sets -----

// crosswalk file

input ///
str3 numiso str15 name str3 alpha
004 "afghanistan" "afg"
248 "aland islands" "ala"
008 "albania" "alb"
end

tempfile crossfile
save "`crossfile'"

list

more

// main data set

clear

input ///
str3 numiso str15 name gdp
004 "afghanistan" 476
248 "aland islands" 644
008 "albania" 500
end

list

*----- what you want -----

merge 1:1 numiso using "`crossfile'"

list
您可能需要调整详细信息,因为数据集描述不精确。请参见帮助合并


这是最近才出现的:显式循环在Stata中不像在其他语言中那样常见,因为默认情况下,命令将影响所有观察结果(从1到N)。请参见示例。

您不需要循环。您想使用
merge
命令。下面是一个例子:

clear

*----- example data sets -----

// crosswalk file

input ///
str3 numiso str15 name str3 alpha
004 "afghanistan" "afg"
248 "aland islands" "ala"
008 "albania" "alb"
end

tempfile crossfile
save "`crossfile'"

list

more

// main data set

clear

input ///
str3 numiso str15 name gdp
004 "afghanistan" 476
248 "aland islands" 644
008 "albania" 500
end

list

*----- what you want -----

merge 1:1 numiso using "`crossfile'"

list
您可能需要调整详细信息,因为数据集描述不精确。请参见帮助合并


这是最近才出现的:显式循环在Stata中不像在其他语言中那样常见,因为默认情况下,命令将影响所有观察结果(从1到N)。请参见示例。

您不需要循环。您想使用
merge
命令。下面是一个例子:

clear

*----- example data sets -----

// crosswalk file

input ///
str3 numiso str15 name str3 alpha
004 "afghanistan" "afg"
248 "aland islands" "ala"
008 "albania" "alb"
end

tempfile crossfile
save "`crossfile'"

list

more

// main data set

clear

input ///
str3 numiso str15 name gdp
004 "afghanistan" 476
248 "aland islands" 644
008 "albania" 500
end

list

*----- what you want -----

merge 1:1 numiso using "`crossfile'"

list
您可能需要调整详细信息,因为数据集描述不精确。请参见帮助合并


这是最近才出现的:显式循环在Stata中不像在其他语言中那样常见,因为默认情况下,命令将影响所有观察结果(从1到N)。请参见示例。

您不需要循环。您想使用
merge
命令。下面是一个例子:

clear

*----- example data sets -----

// crosswalk file

input ///
str3 numiso str15 name str3 alpha
004 "afghanistan" "afg"
248 "aland islands" "ala"
008 "albania" "alb"
end

tempfile crossfile
save "`crossfile'"

list

more

// main data set

clear

input ///
str3 numiso str15 name gdp
004 "afghanistan" 476
248 "aland islands" 644
008 "albania" 500
end

list

*----- what you want -----

merge 1:1 numiso using "`crossfile'"

list
您可能需要调整详细信息,因为数据集描述不精确。请参见帮助合并


这是最近才出现的:显式循环在Stata中不像在其他语言中那样常见,因为默认情况下,命令将影响所有观察结果(从1到N)。参见示例。

@Roberto Ferrer正确地解释了在这里,或者实际上在Stata中,循环观察不是一个好策略,并给出了一个替代解决方案

这就留下了无法解释的代码错误

奇怪的是,我看不出是什么导致了您报告的错误,但还有其他几个错误

  • 导入时,
    num
    中的前导零将被剥离,除非您将它们显式地作为字符串变量导入。Stata将012读数为12

  • 首先,使用
    num
    的值创建两组本地宏。一组应使用
    num
    ;另一个应该使用
    alpha

  • 本质上,局部宏在Stata中是而不是变量。有关这一点和其他常见混淆的讨论,请参阅

  • 这不仅仅是纠正术语:您的代码会出错,因为您将本地宏当作变量引用,而这是行不通的

    您正在使用符号来计算本地宏,但这必须一直进行

  • 在使用
    num
    alpha
    值时,需要双引号来明确您想要的是文字字符串求值

  • 您还将
    foreach
    forvalues
    混淆

  • 您的最后一个循环位于

    foreach x = 1 (1) `N' {
        replace countrycode = ISOalpha_`x' if countrycode == ISOnum_`x'
    }
    
    那应该更像

    forval x = 1(1)`N' {
        replace countrycode = "`ISOalpha_`x''" if countrycode == "`ISOnum_`x''"  
    }
    
    更新:猜测一下,报告的错误出现了,因为实际上您使用的语法与您所说的完全不同

    在Statalist POST中,报告语法,如

      local ISOnum_`x' : num[`x']
    

    这确实是非法的

    Roberto Ferrer正确地解释说,在这里,或者实际上在Stata,循环观察不是一个好的策略,并给出了另一种解决方案

    这就留下了无法解释的代码错误

    奇怪的是,我看不出是什么导致了您报告的错误,但还有其他几个错误

  • 导入时,
    num
    中的前导零将被剥离,除非您将它们显式地作为字符串变量导入。Stata将012读数为12

  • 首先,使用
    num
    的值创建两组本地宏。一组应使用
    num
    ;另一个应该使用
    alpha

  • 本质上,局部宏在Stata中是而不是变量。有关这一点和其他常见混淆的讨论,请参阅

  • 这不仅仅是纠正术语:您的代码会出错,因为您将本地宏当作变量引用,而这是行不通的

    您正在使用符号来计算本地宏,但这必须一直进行

  • 在使用
    num
    alpha
    值时,需要双引号来明确您想要的是文字字符串求值

  • 您还将
    foreach
    forvalues
    混淆

  • 您的最后一个循环位于

    foreach x = 1 (1) `N' {
        replace countrycode = ISOalpha_`x' if countrycode == ISOnum_`x'
    }
    
    那应该更像

    forval x = 1(1)`N' {
        replace countrycode = "`ISOalpha_`x''" if countrycode == "`ISOnum_`x''"  
    }
    
    更新:猜测一下,报告的错误出现了,因为实际上您使用的语法与您所说的完全不同

    在Statalist POST中,报告语法,如

      local ISOnum_`x' : num[`x']
    

    这确实是非法的

    Roberto Ferrer正确地解释了在这里,或者实际上在Stata,循环观察不是一个好策略,并给出了另一种解决方案