Используйте dplyr, чтобы создать новую переменную, используя mutate, в результате чего новое значение будет применено к каждому значению третьей переменной - PullRequest
0 голосов
/ 27 июня 2018

У меня есть данные, которые выглядят так

df <- data.frame(
ID = c(rep("A12345",5), rep("A23456",10), rep("A34567",5), "A45678", "A67891", rep("A78910",8), "A91011", 
       rep("A10111",4), rep("A11121",3), "A12131", "A16731"),
indicator = c(rep("colchicine",5), rep("febuxosat",9), "hosps", rep("colchicine",5), "hosps", "colchicine", 
              rep("allopurinol",8), "allopurinol", 
              rep("colchicine",3), "hosps", rep("colchicine",3), "colchicine", "allopurinol"),
Date = c("2004-12-08", "2005-01-28", "2005-07-15", "2005-08-23", "2005-11-30", "2007-02-01", "2007-07-20", "2014-06-03", 
         "2008-04-17",
         "2008-12-19", "2009-09-09", "2010-02-24", "2010-11-01", "2010-12-03", "2011-08-10", "2012-11-05", "2012-12-17", 
         "2012-12-19", "2013-10-03", "2013-12-11", "2014-03-26", "2015-11-12", "2014-08-07", "2008-01-31", "2008-02-21", 
         "2008-09-19", "2008-11-06", "2009-01-06", "2009-01-14", "2009-03-25", "2009-03-27", "2009-06-18", "2009-08-18", 
         "2009-09-08", "2009-11-13", "2010-01-21", "2010-04-19", "2010-07-07", "2010-08-06", "2010-08-19")
)

Что я хочу сделать, так это если для переменной ID есть ЛЮБОЙ экземпляр, где индикатор == "hosps", то создать новый индикатор с именем "hosp_ever", который равен 1. Если для любого идентификатора , в переменной-индикаторе никогда не было экземпляра "hosps", тогда новая переменная "hosp_ever" равна 0.

Вот как я пытался это сделать:

df_group <- df %>%
group_by(ID) %>%
mutate(hosp_ever = ifelse(indicator == "hosps", "Y", "N"))

Это создает новую переменную hosp_ever, но присваивает «Y» только для случаев, когда индикатор == hosps, hosp_ever неправильно назначается идентификаторам, где индикатор! = Hosps, но у них было событие hosps в какой-то момент.

Это то, что я хотел бы, чтобы мой вывод выглядел как

df_group <- df %>%
mutate(hosps_ever = c(rep("N",5), rep("Y",9), "Y", rep("N",5), "Y", "N", 
     rep("N",8), "N", 
     rep("Y",3), "Y", rep("N",3), "N", "N"))

Кто-нибудь знает, где я иду не так?

Спасибо

1 Ответ

0 голосов
/ 27 июня 2018

Вы можете использовать any для проверки хотя бы одного из indicator в определенной группе ID, равной hosps

library(dplyr)

df_group <- df %>%
  group_by(ID) %>%
  mutate(hosp_ever = ifelse(any(indicator == "hosps"), "Y", "N"))

df_group
#> # A tibble: 40 x 4
#> # Groups:   ID [11]
#>    ID     indicator  Date       hosp_ever
#>    <fct>  <fct>      <fct>      <chr>    
#>  1 A12345 colchicine 2004-12-08 N        
#>  2 A12345 colchicine 2005-01-28 N        
#>  3 A12345 colchicine 2005-07-15 N        
#>  4 A12345 colchicine 2005-08-23 N        
#>  5 A12345 colchicine 2005-11-30 N        
#>  6 A23456 febuxosat  2007-02-01 Y        
#>  7 A23456 febuxosat  2007-07-20 Y        
#>  8 A23456 febuxosat  2014-06-03 Y        
#>  9 A23456 febuxosat  2008-04-17 Y        
#> 10 A23456 febuxosat  2008-12-19 Y        
#> # ... with 30 more rows

Создано в 2018-06-26 пакетом представ. (v0.2.0.9000).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...