在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读数为12num
的值创建两组本地宏。一组应使用num
;另一个应该使用alpha
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读数为12num
的值创建两组本地宏。一组应使用num
;另一个应该使用alpha
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,循环观察不是一个好策略,并给出了另一种解决方案