微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当变量在 R 数据

如何解决当变量在 R 数据

我是 R 的新手。 我有一个数据库(面板),我想根据某些值删除一些观察结果。 我们以下一个面板为例(派生自 plm 包):

Panel <-read.dta("http://dss.princeton.edu/training/Panel101.dta")
> head(Panel)
  country year           y y_bin        x1         x2          x3   opinion op
1       A 1990  1342787840     1 0.2779036 -1.1079559  0.28255358 Str agree  1
2       A 1991 -1899660544     0 0.3206847 -0.9487200  0.49253848     disag  0
3       A 1992   -11234363     0 0.3634657 -0.7894840  0.70252335     disag  0
4       A 1993  2645775360     1 0.2461440 -0.8855330 -0.09439092     disag  0
5       A 1994  3008334848     1 0.4246230 -0.7297683  0.94613063     disag  0
6       A 1995  3229574144     1 0.4772141 -0.7232460  1.02968037 Str agree  1

当 OP=1 时,我想删除下一年的观测值。 例如,如果在 1990 年,OP = 1,我想排除 1991、1992、1992 年等(数据库接下来的所有年份)的国家/地区。如果 1996 年 OP =1,我想排除 1997、1998 和 1999 年的国家。

PS:数据帧可能不是一个很好的例子,但在我的数据帧中,OP = 1 只有一次。

有人知道我该怎么做吗?

提前致谢。

编辑:我忘了说我还想保留每年 OP=0 的观察结果。我正在运行一个 logit 模型。因此我比较 OP=1 和 OP=0。

解决方法

我假设您要为每个 country 分别删除 OP 中 1 之后的所有行。

dplyrfilter 一起使用:

library(dplyr)

Panel <- foreign::read.dta("http://dss.princeton.edu/training/Panel101.dta")

Panel %>%
  group_by(country) %>%
  filter(row_number() <= match(1,op)) %>%
  ungroup

#   country  year           y y_bin      x1     x2     x3 opinion      op
#   <fct>   <int>       <dbl> <dbl>   <dbl>  <dbl>  <dbl> <fct>     <dbl>
# 1 A        1990  1342787840     1  0.278  -1.11  0.283  Str agree     1
# 2 B        1990 -5934699520     0 -0.0818  1.43  0.0234 Agree         1
# 3 C        1990 -1292379264     0  1.31   -1.29  0.204  Agree         1
# 4 D        1990  1883025152     1 -0.314   1.74  0.647  Disag         0
# 5 D        1991  6037768704     1  0.360   2.13  1.10   Disag         0
# 6 D        1992    10244189     1  0.0519  1.68  0.970  Str agree     1
# 7 E        1990  1342787840     1  0.453   1.73  0.597  Str disag     0
# 8 E        1991  2296009472     1  0.419   1.71  0.793  Str agree     1
# 9 F        1990  1342787840     1 -0.568  -0.347 1.26   Str agree     1
#10 G        1990  1342787840     1  0.945  -1.52  1.45   Str disag     0
#11 G        1991 -1518985728     0  1.10   -1.46  1.44   Agree         1

或与 slice 相同:

Panel %>%
  group_by(country) %>%
  slice(seq_len(match(1,op))) %>%
  ungroup
,

我们可以使用slice

library(dplyr)
Panel %>%
     group_by(country) %>%
     slice(seq_len(match(1,op))) %>%
     ungroup

数据

Panel <- foreign::read.dta("http://dss.princeton.edu/training/Panel101.dta")
,

你的回答很棒。但实际上,我忘了在问题中准确说明一些问题。您的回答使我能够保留 op=1 的观察结果。但我也想保留那些每年 OP=0 的人。我正在运行一个 logit 模型。顺便说一下,OP=0 的人将是非采用者,而 OP=1 的人将是采用者。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。