如何基于其他变量中的值组合创建新变量

时间:2019-01-18 10:57:00

标签: r

我正在尝试创建一个新变量,该变量指示是否在预期的一年内为参与者发生了事件。请在下面找到示例数据框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)`

2 个答案:

答案 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