Добавление нового столбца с помощью mutate и group by - PullRequest
0 голосов
/ 19 ноября 2018

Я хочу создать новый столбец с именем age на основе предыдущего столбца и сгруппировать по функциям. Набор данных выглядит следующим образом:

tid<- c(1,2,3,4, 1,2,3,4,1,2,3,4)
active<- c(0,1,0,4, 0,0,0,1,0,0,1,0)
person<- c('John', 'John','John', 'John', 'Emma', 'Emma','Emma','Emma', 'Edward', 'Edward', 'Edward', 'Edward')
df<- data.frame(tid, active, person)

Я хочу создать возраст, который начинается с 0, когда человек впервые активен, то есть значение активного становится больше 0 в первый раз, а затем постепенно добавляется с одним значением для следующей записи. Какие-либо предложения?

Я ожидаю вывод следующим образом:

 name     age 
 John     0
 John     0
 John     1
 John     2
 Emma     0
 Emma     0
 Emma     0
 Emma     0
 Edward   0
 Edward   0
 Edward   0
 Edward   1

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Альтернативное решение, которое также выполняет свою работу:

library(tidyverse)

age_counter = df %>% 
    arrange(tid) %>%
    group_by(person) %>% 
    filter(cumsum(active) > 0) %>% 
    mutate(age = row_number() - 1)

df %>% 
    left_join(age_counter) %>%
    replace_na(list(age = 0)) %>%
    select(person, age)
0 голосов
/ 19 ноября 2018

Решает ли это для вас?

library(dplyr)

df %>% 
  group_by(person) %>% 
  arrange(person, tid) %>%
  mutate(active_dummy = if_else(lag(cumsum(active)) > 0, 1, 0, 0),
         age = cumsum(active_dummy)) %>% 
  select(person, age)

, что дает вам

# A tibble: 12 x 2
# Groups:   person [3]
   person   age
   <chr>  <dbl>
 1 John      0.
 2 John      0.
 3 John      1.
 4 John      2.
 5 Emma      0.
 6 Emma      0.
 7 Emma      0.
 8 Emma      0.
 9 Edward    0.
10 Edward    0.
11 Edward    0.
12 Edward    1.
...