Loops 从Stata中的变量创建具有唯一观测值的向量

Loops 从Stata中的变量创建具有唯一观测值的向量,loops,matrix,stata,frequency,Loops,Matrix,Stata,Frequency,我主要想做的是创建一个变量,在这个变量中,我可以在我的样本的一个层(例如,由一个“id”变量定义)中指定一个名称,该名称与另一个(字符串)变量中该相同名称的最高频率(在层中)相关联。如果制表*能够按照我需要的方式工作,我的代码将如下运行: gen new_class_within_id="" forvarlues i=1/80 { tab class_var, matcell(x) if id==`i' svmat x sum x2 local

我主要想做的是创建一个变量,在这个变量中,我可以在我的样本的一个层(例如,由一个“id”变量定义)中指定一个名称,该名称与另一个(字符串)变量中该相同名称的最高频率(在层中)相关联。如果
制表
*能够按照我需要的方式工作,我的代码将如下运行:

gen new_class_within_id=""

forvarlues i=1/80 {
      tab class_var, matcell(x) if id==`i'
      svmat x
      sum x2
      local name =x1 if x2==r(max)
      replace new_class_within_id=`name' if id==`i'
}
如果
制表
允许在矩阵中存储唯一的观测名称,那么这就是一般的想法——当然,代码也可能有一些意外错误。但是,虽然使用上述代码似乎不可能,但我认为如果我能够在循环中存储向量中的唯一观测值,并进行一些额外的编码,我可以使用
mkmat
。那可能吗?还有,有没有更简单的方法来完成我想做的事情


*首先,我认为使用
制表
并将结果提取到矩阵中可以完成我需要的工作,但是
制表
不允许我提取观测值的名称,只允许提取频率<代码>制表看起来不错,因为在它的输出中,它在一列中显示了变量的唯一观察值,但我找不到一种方法以输出显示的方式提取这些观察值。

我想我理解你的问题,但也许我不理解。一些代码:

clear
set more off

input ///
id str1 anothvar
1 a
1 a
1 a
1 b
1 m
2 c
2 c
2 m
2 a
2 z
end

list, sepby(id)

*-----

bysort id anothvar : gen count = _N
bysort id (count): gen newvar = anothvar[_N]

list, sepby(id)

如果您有遗漏和/或联系,还需要做更多的工作。

这似乎正是我所需要的!非常感谢。此外,对于最频繁的值,有一个标准的统计名称。正如你所知,这是一种模式。
egen
函数
mode()。因此,
egen newvar=mode(anothvar),by(id)
可以让您一次到达那里。请注意,
mode()
还有其他机制来处理丢失和绑定。默认情况下,它会忽略缺失。根据通用字典的定义,“唯一”观察只发生一次。我建议这里使用“独特”一词更好。此外,Stata中的观测没有名称;它们在特定变量中有值,并且根据当前排序顺序有观察值,但没有名称。只是为了表明这允许以统计术语进行简明摘要:您想要确定模式。这里我们很高兴地允许模式也表示字符串变量的模式。