我正在尝试对数据进行子集化,以便它只保留变量的第一次出现。我正在查看追踪工人职业生涯的面板数据,并尝试对数据进行子集化,以便它只显示直到每个人成为老板。
id year name job job2
1 1990 Bon Manager 0
1 1991 Bon Manager 0
1 1992 Bon Manager 0
1 1993 Bon Boss 1
1 1994 Bon Manager 0
2 1990 Jane Manager 0
2 1991 Jane Boss 1
2 1992 Jane Manager 0
2 1993 Jane Boss 1
所以我希望数据看起来像:
id year name job job2
1 1990 Bon Manager 0
1 1991 Bon Manager 0
1 1992 Bon Manager 0
1 1993 Bon Boss 1
2 1990 Jane Manager 0
2 1991 Jane Boss 1
这看起来像是基本的审查,但为了我的分析,这是至关重要的......!任何帮助,将不胜感激。
这是一个 dplyr 解决方案,它使用两个有用的窗函数 http://cran.r-project.org/web/packages/dplyr/vignettes/window-functions.html lag()
and cumall()
:
df <- read.table(header = TRUE, text = "
id year name job job2
1 1990 Bon Manager 0
1 1991 Bon Manager 0
1 1992 Bon Manager 0
1 1993 Bon Boss 1
1 1994 Bon Manager 0
2 1990 Jane Manager 0
2 1991 Jane Boss 1
2 1992 Jane Manager 0
2 1993 Jane Boss 1
", stringsAsFactors = FALSE)
library(dplyr)
# Use mutate to see the values of the new variables
df %>%
group_by(id) %>%
mutate(last_job = lag(job, default = ""), cumall(last_job != "Boss"))
# Use filter to see the results
df %>%
group_by(id) %>%
filter(cumall(lag(job, default = "") != "Boss"))
We use lag()
找出每个人上一年从事的工作,然后使用cumall()
将所有行保留到“Boss”的第一个实例。如果数据尚未按年份排序,您可以使用lag(job, order_by = year)
确保;确定lag()
使用年份值而不是行顺序来确定哪一年是“去年”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)