Как создать новую переменную на основе комбинации значений в других переменных - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь создать новую переменную, которая указывает, произошло ли событие для участника в течение ожидаемого года.Ниже приведен пример фрейма данных df_raw.ID - это код участников, chil.int указывает, через сколько лет можно ожидать появления первого ребенка, событие указывает на то, что роды произошли, год указывает на год.

Я думал о переменной, которая в 1, еслизначение в году + значение в chil.int идентично значению года в строке, где событие == 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 голосов
/ 18 января 2019

Это долго, и я опаздываю на вечеринку, но здесь идет речь: Логика для 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
0 голосов
/ 18 января 2019

Если я правильно понял логику, то вот решение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...