【问题标题】:Deleting same observations in two tables删除两个表中的相同观察
【发布时间】:2018-03-13 00:53:49
【问题描述】:

假设我有以下数据:

表 1(我的主数据集):

clear 
input str1 Name str9 (Day Time)   
 A     24-Mar-08  "10:30:01"       
 A     24-Mar-08  "10:30:01"      
 B     24-Mar-08  "10:30:01"      
 B     24-Mar-08  "11:03:12"       
 B     24-Mar-08  "11:03:12"       
 C     25-Mar-08  "10:30:01"       
 D     25-Mar-08  "10:30:01"      
 D     25-Mar-08  "11:13:59"       
 E     25-Mar-08  "11:13:59"       
 F     25-Mar-08  "11:13:59"       
 F     25-Mar-08  "11:13:59"       
 F     25-Mar-08  "11:59:01"       
end 

表 2:

clear 
input str1 Insrument str9 (Day Time) float price  
 A     30-Mar-10  "09:29:34"  10    
 E     03-Mar-09  "08:23:19"  14   
 E     20-Mar-12  "12:15:11"  29    
 F     01-Mar-11  "10:30:01"  12     
end 

我想从表 1 中删除基于 name 变量的重复观察。我在 Stata 中打开表 1,需要将表 2 引入 Stata,然后从表中删除两个表中具有相同名称的相同观察1.

最后,结果是:

+------+------------+----------+
| name |    date    |    time  |
+------+------------+----------+
| B    |  24-Mar-08 | 10:30:01 |
| B    |  24-Mar-08 | 11:03:12 |
| B    |  24-Mar-08 | 11:03:12 |
| C    |  25-Mar-08 | 10:30:01 |
| D    |  25-Mar-08 | 10:30:01 |
| D    |  25-Mar-08 | 11:13:59 |
+------+------------+----------+

SAS中的SQL代码是:

proc SQL;
    create table table3 as
    select * from table1
    where name not in (select Instrument from table2);
quit;

我如何通过 Stata 使用这个程序?

【问题讨论】:

    标签: stata


    【解决方案1】:

    最简单的方法是合并名称并仅保留不匹配的名称:

    clear 
    input str1 Name str9 (Day Time)   
     A     24-Mar-08  "10:30:01"       
     E     24-Mar-08  "10:30:01"      
     E     24-Mar-08  "10:30:01"      
     F     24-Mar-08  "11:03:12"       
    end 
    
    keep Name 
    duplicates drop
    tempfile names
    save "`names'"
    
    clear 
    input str1 Name str9 (Day Time)   
     A     24-Mar-08  "10:30:01"       
     A     24-Mar-08  "10:30:01"      
     B     24-Mar-08  "10:30:01"      
     B     24-Mar-08  "11:03:12"       
     B     24-Mar-08  "11:03:12"       
     C     25-Mar-08  "10:30:01"       
     D     25-Mar-08  "10:30:01"      
     D     25-Mar-08  "11:13:59"       
     E     25-Mar-08  "11:13:59"       
     F     25-Mar-08  "11:13:59"       
     F     25-Mar-08  "11:13:59"       
     F     25-Mar-08  "11:59:01"       
    end 
    
    merge m:1 Name using "`names'", keep(master) nogen
    list, clean noobs
    

    这会产生:

    Name         Day       Time  
       B   24-Mar-08   10:30:01  
       B   24-Mar-08   11:03:12  
       B   24-Mar-08   11:03:12  
       C   25-Mar-08   10:30:01  
       D   25-Mar-08   10:30:01  
       D   25-Mar-08   11:13:59  
    

    【讨论】:

    • 如果表2和表1中的变量不一样,比如表2还有'Price'这样的变量,那么答案是什么?虽然没有必要将价格变量添加到表 1。
    • 我并没有真正理解你的问题。你能用这个案例修改你的例子吗?
    • 我正在处理表1,需要将表2添加到Stata,这意味着我的主数据集是表1。对于变量之间的差异,请考虑表2中的变量'name'是'仪器'。
    • 您可以修改keep 语句以包含其他变量,但是如果这些观察因名称而异,您将需要添加一些关于要保留哪些观察的逻辑。如果您添加这些其他变量,它们将与表 1 合并。您还可以将名称和日期合并在一起。不要尝试 m:m 合并;这很少是你想要的。
    • 更好的例子,这个程序在 SAS 中的 SQL 代码是:proc SQL; create table table3 as select * from table1 where name not in (select Instrument from Table2); quit;
    【解决方案2】:
    // Keeping equities
    rename name Instrument
    merge m:1 Instrument using "file name path"
    keep if _merge == 3
    keep Instrument Day Time
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 2022-08-17
      相关资源
      最近更新 更多