Dplyr решение с использованием среза и группы - PullRequest
0 голосов
/ 23 сентября 2018

Ciao, вот мой реплицирующий пример.

    a=c(1,2,3,4,5,6)
    a1=c(15,17,17,16,14,15)
    a2=c(0,0,1,1,1,0)
    b=c(1,0,NA,NA,0,NA)
    c=c(2010,2010,2010,2010,2010,2010)
    d=c(1,1,0,1,0,NA)
    e=c(2012,2012,2012,2012,2012,2012)
    f=c(1,0,0,0,0,NA)
    g=c(2014,2014,2014,2014,2014,2014)
    h=c(1,1,0,1,0,NA)
    i=c(2010,2012,2014,2012,2014,2014)
    mydata = data.frame(a,a1,a2,b,c,d,e,f,g,h,i)
    names(mydata) = c("id","age","gender","drop1","year1","drop2","year2","drop3","year3","drop4","year4")
    mydata2 <- reshape(mydata, direction = "long", varying = list(c("year1","year2","year3","year4"), c("drop1","drop2","drop3","drop4")),v.names = c("year", "drop"), idvar = "X", timevar = "Year", times = c(1:4))
    x1 = mydata2 %>% 
      group_by(id) %>% 
      slice(which(drop==1)[1])
    x2 = mydata2 %>% 
      group_by(id) %>% 
      slice(which(drop==0)[1])

У меня есть данные "mydata2", которые такие большие, что у каждого идентификатора много строк.

Я хочу сделать новый набор данных "x" таким, чтобы у каждого идентификатора была одна строка, основанная на том, удаляются они или нет.Первое из drop1 drop2 drop3 drop4, равное 1, я хочу взять год этого и поместить его в переменную dropYEAR.Если ни одно из drop1 drop2 drop3 drop4 не равно 1, я хочу поместить последнюю точку данных в year1 year2 year3 year4 в переменную dropYEAR.

В конечном итоге каждый идентификатор должен иметь 1 строку, и я хочу создать 2 новых столбца:didDROP равно 1, если идентификатор когда-либо упал или 0, если идентификатор никогда не удалялся.dropYEAR равен году падения, если didDROP равно 1 или равен последнему отчетному году1 год2 год3 год4, если идентификатор никогда не падал.Я пытаюсь сделать это в dplyr, но это дает часть того, что я хочу, только потому, что он избавляется от значений ID, равных 0.

Это желаемый вывод, спасибо @Wimpel This is desired output

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Вы можете сортировать по идентификатору, падению и году, при условии сбрасывания или нет:

library(dplyr)
mydata2 %>%
  mutate(drop=ifelse(is.na(drop),0,drop)) %>%
  arrange(id,-drop,year*(2*drop-1)) %>%
  group_by(id) %>%
  slice(1) %>%
  select(id,age,gender,didDROP=drop,dropYEAR=year)

# A tibble: 6 x 5
# Groups:   id [6]
     id   age gender didDROP dropYEAR
  <dbl> <dbl>  <dbl>   <dbl>    <dbl>
1     1    15      0       1     2010
2     2    17      0       1     2012
3     3    17      1       0     2014
4     4    16      1       1     2012
5     5    14      1       0     2014
6     6    15      0       0     2014
0 голосов
/ 23 сентября 2018

Сначала mydata2 %>% arrange(id), чтобы понять набор данных, затем, используя dplyr first и last, мы можем получить первый год, где drop==1, и последний год в случае падения никогда не получим 1, где drop - этоненулевой.Использование case_when для проверки didDROP, поскольку у него есть замечательная магия при работе с АН.

library(dplyr)
mydata2 %>% group_by(id) %>% 
            mutate(dropY=first(year[!is.na(drop) & drop==1]), 
                   dropYEAR=if_else(is.na(dropY), last(year[!is.na(drop)]),dropY)) %>%
            slice(1)


#Update
mydata2 %>% group_by(id) %>% 
            mutate(dropY=first(year[!is.na(drop) & drop==1]), 
                   dropYEAR=if_else(is.na(dropY), last(year),dropY), 
                   didDROP=case_when(any(drop==1) ~ 1, #Return 1 if there is any drop=1 o.w it will return 0
                                     TRUE ~ 0)) %>%
            select(-dropY) %>% slice(1)

# A tibble: 6 x 9
# Groups:   id [6]
       id   age gender  Year  year  drop     X dropYEAR didDROP
    <dbl> <dbl>  <dbl> <int> <dbl> <dbl> <int>    <dbl>   <dbl>
1     1    15      0     1  2010     1     1     2010       1
2     2    17      0     1  2010     0     2     2012       1
3     3    17      1     1  2010    NA     3     2014       0
4     4    16      1     1  2010    NA     4     2012       1
5     5    14      1     1  2010     0     5     2014       0
6     6    15      0     1  2010    NA     6     2014       0

Надеюсь, это то, что вы ищете.

...