【问题标题】:How to repeat observation in a variety range?如何在多种范围内重复观察?
【发布时间】:2023-04-11 03:14:01
【问题描述】:

我想在每个name 中为下一个date 重复drop 变量。

考虑以下数据框:

* Example generated by -dataex-. To install: ssc install dataex
clear
input str4 name long date str8 time float drop
"A" 17659 "11:32:41" 1
"A" 17659 "12:32:41" 1
"A" 17659 "13:32:41" 1
"A" 17660 "11:32:41" .
"A" 17660 "12:32:41" .
"A" 17660 "13:32:41" .
"A" 17660 "14:32:41" .
"B" 17659 "11:32:41" .
"B" 17659 "12:32:41" .
"B" 17659 "13:32:41" .
"B" 17659 "14:32:41" .
"B" 17660 "11:32:41" 1
"B" 17660 "12:32:41" 1
"B" 17661 "11:32:41" 1
"B" 17661 "12:32:41" 1
"C" 17659 "11:32:41" 1
"C" 17659 "12:32:41" 1
"C" 17660 "11:32:41" .
"C" 17660 "12:32:41" .
"C" 17660 "13:32:41" .
"C" 17661 "11:32:41" .
"C" 17661 "12:32:41" .
"C" 17661 "13:32:41" .
"C" 17661 "14:32:41" .
end
format %d date

所以结果是:

+------+-----------+----------+-------+
| name |   date    |   time   | drop  |
+------+-----------+----------+-------+
| A    | 07may2008 | 11:32:41 |     1 |
| A    | 07may2008 | 12:32:41 |     1 |
| A    | 07may2008 | 13:32:41 |     1 |
| A    | 08may2008 | 11:32:41 |     1 |
| A    | 08may2008 | 12:32:41 |     1 |
| A    | 08may2008 | 13:32:41 |     1 |
| A    | 08may2008 | 14:32:41 |     1 |
| B    | 07may2008 | 11:32:41 |       |
| B    | 07may2008 | 12:32:41 |       |
| B    | 07may2008 | 13:32:41 |       |
| B    | 07may2008 | 14:32:41 |       |
| B    | 08may2008 | 11:32:41 |     1 |
| B    | 08may2008 | 12:32:41 |     1 |
| B    | 09may2008 | 11:32:41 |     1 |
| B    | 09may2008 | 12:32:41 |     1 |
| C    | 07may2008 | 11:32:41 |     1 |
| C    | 07may2008 | 12:32:41 |     1 |
| C    | 08may2008 | 11:32:41 |     1 |
| C    | 08may2008 | 12:32:41 |     1 |
| C    | 08may2008 | 13:32:41 |     1 |
| C    | 09may2008 | 11:32:41 |       |
| C    | 09may2008 | 12:32:41 |       |
| C    | 09may2008 | 13:32:41 |       |
| C    | 09may2008 | 14:32:41 |       |
+------+-----------+----------+-------+

最后,如果我们使用drop if drop == 1,结果是:

+------+-----------+----------+-------+
| name |   date    |   time   | drop  |
+------+-----------+----------+-------+
| B    | 07may2008 | 11:32:41 |       |
| B    | 07may2008 | 12:32:41 |       |
| B    | 07may2008 | 13:32:41 |       |
| B    | 07may2008 | 14:32:41 |       |
| C    | 09may2008 | 11:32:41 |       |
| C    | 09may2008 | 12:32:41 |       |
| C    | 09may2008 | 13:32:41 |       |
| C    | 09may2008 | 14:32:41 |       |
+------+-----------+----------+-------+

【问题讨论】:

  • 到目前为止您尝试过什么?向我们展示您的一些代码。
  • 也许我可以使用 gen drop2 = drop[_n-1] 为下一个日期创建一个等于 1 的新观察值,然后将其添加到 drop 变量中以获得该 date
  • 您基本上是在寻求一种解决方案来处理您之前帖子中的重复条目。那么您是否只想在下一个日期之后删除所有重复项?
  • 没有。我只想删除 drop 值等于 1 的观察结果。
  • 好吧,那replace name = . if drop == 1有什么问题?

标签: date for-loop stata


【解决方案1】:
gen a=0
replace a=1 if(drop[_n]==1 & drop[_n+1]==. & name[_n]==name[_n+1] & _n < _N)
replace a=1 if(drop[_n]==. & drop[_n-1]==1 & name[_n]==name[_n-1] & _n < _N)
bysort name date: egen b=max(a)
sort name date

drop if b==1
drop if drop ==1
drop drop a b

编辑尼克考克斯

gen a = drop==1 & drop[_n+1]==. & name==name[_n+1] & _n < _N
replace a=1 if drop==. & drop[_n-1]==1 & name==name[_n-1] & _n < _N
bysort name date (a): gen b = a[_N] 

drop if b==1 | drop ==1
drop drop a b

【讨论】:

  • +1 来自我对 egen 的创造性使用。此外,在没有 for 循环的情况下使用 replace 是一种不错的方法,并且在更大的数据集中会更快。
  • 我冒昧地缩短了您的代码并展示了如何避免egen。条件_n &lt; _N 在第一条语句中是多余的,因为name[_N] == name[_N+1] 是不可能的,除非name[_N] 缺失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 2011-09-27
相关资源
最近更新 更多