Loops 在元素列表中标识唯一的字符串值

Loops 在元素列表中标识唯一的字符串值,loops,stata,unique-values,Loops,Stata,Unique Values,我有一个不平衡的大型数据集,其中每个观测值可以获取多个字符串值,每个值存储在一个单独的变量中: obs year var1 var2 var3 newval 1 1990 str1 str2 str3 3 1 1991 str1 str4 str5 2 2 1990 str3 str4 2 2 1991 str4

我有一个不平衡的大型数据集,其中每个观测值可以获取多个字符串值,每个值存储在一个单独的变量中:

obs    year   var1    var2    var3    newval  

1      1990   str1    str2    str3     3   

1      1991   str1    str4    str5     2  

2      1990   str3    str4             2  

2      1991   str4    str5             1  

2      1993   str3    str5             0 

2      1994   str7                     1
在每个时间点和每次观察中,我需要计算字符串值是否为“新”。这意味着,在前几年的观测值中,它们没有出现

我应该如何在Stata解决这个问题


谢谢。

也许有一种更优雅的方法可以做到这一点

其主要思想是,我首先重塑数据,并按顺序计算每个字符串的出现次数。重塑使这更容易。然后我将使用collapse进行聚合,但只计算每个字符串出现的第一个实例。然后我将重新加入到您的原始数据

#delimit;

preserve;
    tempfile newval;

    reshape long var, i(obs year) j(s); // stack all the vars on top of each other
    bys obs var (year): gen n=_n if !missing(var); // number the appearance of each string in chronological order
    replace n=0 if n>1 & !missing(n); // only count the first instance

    collapse (sum) mynewval=n, by(obs year); // add up the counts
    save `newval';
restore;

merge 1:1 obs year using `newval', nogen;

compare newval mynewval;

这个问题也发布在Statalist上。这是我的答案。我倾向于不使用
merge
s,除非问题从两个或更多文件开始

clear
input obs     yr   str4 var1 str4  var2 str4   var3
1        90   str1    str2    str3
1        91    str1    str4    str5
2        90    str3    str4
2        91    str4    str5
2        93    str3    str5
2        94    str7
end
reshape long var , i(obs yr) j(which)
bysort obs var (yr) : gen new = _n == 1 & !missing(var)
bysort obs yr : replace new = sum(new)
by obs yr : replace new = new[_N]
reshape wide var, i(obs yr) j(which)
(更多)进一步的评论主要集中在效率上,这里指的是速度而不是空间。(存储空间可能会咬到海报。)

如果不进行重构,这里使用
重塑
,问题是一个三重循环:标识符过多、每个标识符的观察过多和变量过多。可能两个外部循环可以折叠为一个。但在Stata中,显式循环观测通常很慢

在Dimitry和我提出的重构解决方案中,
by:
操作直接进入已编译代码,速度相对较快:
重塑
是解释代码,需要进行文件操作,因此速度可能较慢。另一方面,
reformate
可以很快地用一些经验来写下来,而且真正值得获得经验带来的
reformate
的流畅性。除了
重塑
的帮助和手动输入外,请参阅我在上写的
重塑
的常见问题解答


另一个需要考虑的问题是,您还想对这种数据集做些什么。如果有类似性质的其他问题,通常使用
重塑
生成的长结构会更容易解决,因此保留该结构将是一个好主意

(+1)更加优雅!你好,尼克,非常感谢,这很有帮助!如果我可以跟进的话:我从你(和迪米特里的回答)的观点来看,重塑是处理这个问题的一种更有效的方法,而不是像你在“计算一组变量的不同字符串数/Stata FAQ”中建议的那样,在obs上构建值列表/循环。我问bc我有一个大的数据集,很多字符串vb和重塑需要很长时间。谢谢这里的“效率”是什么?您是否将程序员时间包括在任何计算中?您的案例包括任何变量中的新值,这意味着要跟踪到目前为止在所有变量中看到的值。你可以试着在常见问题解答中的想法基础上再接再厉。我不知道哪条路更快。我知道我可以更快地写出上面的解,这是我的计算。对!执行重塑命令的时间与编程时间的机会成本相比相形见绌(对于初学者来说是巨大的)。因此,我正在使用我更了解的代码运行。经验教训:-)机会成本!我想你只是把自己定位为一名经济学家。请参阅我的答案中(更多)下的更多详细信息。