我正在尝试创建一个新变量,该变量指示是否在预期的一年内为参与者发生了事件。请在下面找到示例数据框df_raw。 ID是参与者的代码,chil.int表示一个人在第一个孩子中怀孕了多少年,事件表示已分娩,年份表示年份。
我考虑过一个变量,如果year的值+ chil.int中的值等于event == 1的行中的year值,则该变量应为1。如果不是这种情况,则该变量应为0。
在下面的数据框中,对于个人A和B,在此新列中应为1,但对于个人C应为0。每个至少一次准确预期一个事件的参与者应获得1分。请参阅df_new。
有人知道如何实现吗?还是您有其他解决此问题的想法?
坦克很多!
原始数据框:
`df_raw <- read.table(text="
ID chil.int event year
row.name11 A 3 0 2013
row.name12 A 2 0 2014
row.name13 A 1 0 2015
row.name14 A 4 1 2016
row.name15 A 3 0 2017
row.name16 A 2 0 2018
row.name17 B 5 0 2010
row.name18 B 4 0 2011
row.name19 B 3 0 2012
row.name20 B 2 0 2013
row.name21 B NA 1 2015
row.name22 C 1 0 2015
row.name23 C 1 0 2016
row.name24 C NA 0 2017
",header=T)`
df_new是我希望最终数据帧的外观。
`df_new <- read.table(text="
ID chil.int event year new.col
row.name11 A 3 0 2013 1
row.name12 A 2 0 2014 1
row.name13 A 1 0 2015 1
row.name14 A 4 1 2016 1
row.name15 A 3 0 2017 1
row.name16 A 2 0 2018 1
row.name17 B 5 0 2010 1
row.name18 B 4 0 2011 1
row.name19 B 3 0 2012 1
row.name20 B 2 0 2013 1
row.name21 B NA 1 2015 1
row.name22 C 1 0 2015 0
row.name23 C 1 0 2016 0
row.name24 C NA 0 2017 0
",header=T)`
答案 0 :(得分:0)
假设我正确理解了逻辑,那么这里是一个data.table
解决方案。
重新解释一下逻辑:如果一个人(由ID
标识)曾经拥有chil.int + year %in% year[event == 1]
,那么他/她的所有行都会在1
中得到new.col
。如果year + chil.int
中的任何一个等于发生事件的年份中的任何一年(尽管在此示例中,每个ID
最多发生一次)。
library(data.table)
setDT(df_raw)
df_raw[, new.col := as.integer(any((chil.int + year) %in% year[event == 1])), by = ID]
df_raw
ID chil.int event year new.col
1: A 3 0 2013 1
2: A 2 0 2014 1
3: A 1 0 2015 1
4: A 4 1 2016 1
5: A 3 0 2017 1
6: A 2 0 2018 1
7: B 5 0 2010 1
8: B 4 0 2011 1
9: B 3 0 2012 1
10: B 2 0 2013 1
11: B NA 1 2015 1
12: C 1 0 2015 0
13: C 1 0 2016 0
14: C NA 0 2017 0
答案 1 :(得分:0)
这很长,我参加聚会很晚,但是可以这样:C的逻辑尚不清楚。所以我使用了不同的方法
yrs<-strsplit(as.character(df_raw$year), "")
Yrs1<-matrix(unlist(yrs),byrow = T,ncol=4)
str(Yrs1)
Yrs1<-as.data.frame(Yrs1) %>%
mutate_if(is.character,as.numeric) %>%
mutate(ID2=as.factor(row_number()))
df_raw<-df_raw %>%
mutate(ID2=as.factor(row_number()))
df_raw%>%
left_join(Yrs1) %>%
mutate_if(is.factor,as.character) %>%
mutate(V1=as.numeric(V1),V2=as.numeric(V2),V3=as.numeric(V3),V4=as.numeric(V4),
Sum=V1+V2+V3+V4+chil.int,Sum2=V1+V2+V3+V4) %>%
select(-ID2,-starts_with("V")) %>%
mutate(event=ifelse(Sum2+chil.int==Sum&ID%in%c("A","B"),1,0))
#%>%
#select(-Sum,-Sum2)
输出:
ID1 ID chil.int event year Sum Sum2
1 row.name11 A 3 1 2013 9 6
2 row.name12 A 2 1 2014 9 7
3 row.name13 A 1 1 2015 9 8
4 row.name14 A 4 1 2016 13 9
5 row.name15 A 3 1 2017 13 10
6 row.name16 A 2 1 2018 13 11
7 row.name17 B 5 1 2010 8 3
8 row.name18 B 4 1 2011 8 4
9 row.name19 B 3 1 2012 8 5
10 row.name20 B 2 1 2013 8 6
11 row.name21 B NA NA 2015 NA 8
12 row.name22 C 1 0 2015 9 8
13 row.name23 C 1 0 2016 10 9
14 row.name24 C NA 0 2017 NA 10