dam*_*l10 3 r case-when stata dplyr mutate
我有一个数据框(fbwb),在一组参与者中使用多个度量(1-3)对欺凌(1-6)进行多次评估.df看起来像这样:
fbwb <- read.table(text="id year bully1 bully2 bully3 cbully bully_ever
100 1 NA 1 NA 1 1
100 2 1 1 NA 1 1
100 3 NA 0 NA 0 1
101 1 NA NA 1 1 1
102 1 NA 1 NA 1 1
102 2 NA NA NA NA 1
102 3 NA 1 1 1 1
102 4 0 0 0 0 1
103 1 NA 1 NA 1 1
103 2 NA 0 0 0 1", header=TRUE)
Run Code Online (Sandbox Code Playgroud)
其中bully1,bully2和bully3是二进制变量,如果在相应的度量上报告了欺凌,则每个变量= 1.如果给定年份的3个欺凌变量中的任何一个= 1,则cbully是二进制的并且= 1.bully_ever是二进制的,如果在任何一年中针对给定参与者的任何措施报告了欺凌,则为= 1.
我想在我的df中创建一个名为bully_past的新二进制变量.bully_past表示任何过去年份中cbully = 1的情况.这与bully_ever略有不同.例如,如果参与者被评估了4次:
我尝试了很多东西,但最近的演绎如下:
fbwb <- fbwb %>%
dplyr::group_by(id) %>%
dplyr::mutate(bully_past = case_when(cbully == 1 & year == (year - 1) |
cbully == 1 & year == (year - 2) |
cbully == 1 & year == (year - 3) |
cbully == 1 & year == (year - 4) |
cbully == 1 & year == (year - 5) ~ 1,
(is.na(cbully) & year == (year - 1) &
is.na(cbully) & year == (year - 2) &
is.na(cbully) & year == (year - 3) &
is.na(cbully) & year == (year - 4) &
is.na(cbully) & year == (year - 5)) ~ NA_real_,
TRUE ~ 0)) %>%
dplyr::ungroup()
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为指示使用哪些年份的语法不正确 - 因此它生成一列NA值.我做了其他的尝试,但我没能设法考虑所有上一年的观察.
可以使用以下代码在Stata中完成:
gen bullyingever = bullying
sort iid time
replace bullyingever = 1 if bullying[_n - 1]==1 & iid[_n - 1]==iid
replace bullyingever = 1 if bullying[_n - 2]==1 & iid[_n - 2]==iid
replace bullyingever = 1 if bullying[_n - 3]==1 & iid[_n - 3]==iid
replace bullyingever = 1 if bullying[_n - 4]==1 & iid[_n - 4]==iid
replace bullyingever = 1 if bullying[_n - 5]==1 & iid[_n - 5]==iid
Run Code Online (Sandbox Code Playgroud)
我很欣赏有关如何在R中完成此任务的任何输入,最好使用dplyr.
在这里,我们可以编写一个辅助函数,可以查看以前的事件cumsum(使用事件的累积帐户来查看过去)以及lag()仅查看当前值.所以我们有
had_previous_event <- function(x) {
lag(cumsum(!is.na(x) & x==1)>0)
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以将其与dplyr链条一起使用
fbwb %>%
arrange(id, year) %>%
group_by(id) %>%
mutate(bully_past = had_previous_event(cbully))
Run Code Online (Sandbox Code Playgroud)
返回TRUE/FALSE但是如果你想要零/一,你可以改变它
mutate(bully_past = as.numeric(had_previous_event(cbully)))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
391 次 |
| 最近记录: |