Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何检查宏的元素是否在另一个宏中_String_Unique_Stata - Fatal编程技术网

String 如何检查宏的元素是否在另一个宏中

String 如何检查宏的元素是否在另一个宏中,string,unique,stata,String,Unique,Stata,我有一个看似简单的问题,但实际上它似乎更复杂。例如,在python中,它似乎要简单得多。但我真的很想学习如何在斯塔塔做到这一点 假设我有一个大数据集。我有几个字符串变量,S1、S2和S3。我根据一些标准得到了S1的子集。假设这得到了我(排序后,只显示感兴趣的数据): 根据不同的标准,对于S2,我得到: S2 1 B 2 B 3 C 4 F 对于S3: S3 1 B 2 Long string 我感兴趣的是获取跨越S1、S2和S3的所有不同值的列表。我认

我有一个看似简单的问题,但实际上它似乎更复杂。例如,在python中,它似乎要简单得多。但我真的很想学习如何在斯塔塔做到这一点

假设我有一个大数据集。我有几个字符串变量,
S1
S2
S3
。我根据一些标准得到了
S1
的子集。假设这得到了我(排序后,只显示感兴趣的数据):

根据不同的标准,对于
S2
,我得到:

    S2
1   B
2   B
3   C
4   F
对于
S3

    S3
1   B
2   Long string
我感兴趣的是获取跨越
S1
S2
S3
的所有不同值的列表。我认为这样做的一个方法是:

  • S1
    的所有所需值保存到宏
    M1
    中。我不明白一个人是怎么做到的
  • 将所有所需的
    S2
    值保存到宏
    M2
  • 检查
    M2
    的值是否在
    M1
    中。不要将
    M2
    的值添加到
    M1
    中已经存在的
    M1
    ,而是将
    M2
    的值添加到
    M1
    中还没有的值。这似乎类似于如何执行此步骤。(为什么在
    列表前面有一个
    ?)
  • 重复步骤3,除了
    S3
    /
    M3
    而不是
    S2
    /
    M2
  • 这将生成具有以下值的宏
    M1

    A   B   C   D   E   F   Long String
    

    请注意,我不需要将其放在宏中。如果可以采用矩阵或其他方式,也可以。重要的部分是获取信息

    有几种方法可以做到这一点

    在这个例子中做了很多假设(在你的帖子中有很多事情不清楚):

    如果您想使用宏来完成,则
    帮助宏列表
    帮助级别
    可以帮助:

    clear
    set more off
    
    input ///
    str15(s1 s2 s3)
    a "b" "b"
    b "b" "long string"
    c "c" ""
    d "f" ""
    e "" ""
    end
    
    list
    
    local uvalues
    foreach var of varlist _all {
        levelsof `var', local(loc`var')
        local uvalues : list uvalues | loc`var'
    }
    
    display `"`uvalues'"'
    

    更多地说明变量的组织方式(例如,一个或多个文件)、是否有意破坏原始数据集、丢失的处理等,可能会让您得到一个特别的答案。

    您是否阅读了
    帮助宏列表中的文档
    ?尽管您读了最后一段,你希望如何表达这一点确实会有所不同。如果你真正的问题像你的例子所暗示的那样小,那么宏操作就是你选择的工具,你可能比从
    levelsof
    开始做得更糟。如果您有一个大问题,并且/或者您希望使用不同的值作为数据进行下游操作,则数据集操作集中在减少数据集,然后应用
    合并
    可能是完全不同的方法。我不在乎是否破坏原始数据集。我能够修改您提供的代码,以获得所需的确切解决方案。谢谢
    clear
    set more off
    
    input ///
    str15(s1 s2 s3)
    a "b" "b"
    b "b" "long string"
    c "c" ""
    d "f" ""
    e "" ""
    end
    
    list
    
    stack s*, into(news) clear
    bysort news : keep if _n == 1
    
    drop _stack
    list
    
    clear
    set more off
    
    input ///
    str15(s1 s2 s3)
    a "b" "b"
    b "b" "long string"
    c "c" ""
    d "f" ""
    e "" ""
    end
    
    list
    
    local uvalues
    foreach var of varlist _all {
        levelsof `var', local(loc`var')
        local uvalues : list uvalues | loc`var'
    }
    
    display `"`uvalues'"'