Условное форматирование сгруппированных данных в R - PullRequest
0 голосов
/ 25 июня 2018
UPRN    Start.Date  End.Date  Disability
1       2006-12-20 17-NOV-17         Y
1       2006-12-20 17-NOV-17         N
2       1991-12-06                   N
2       1991-12-06                   N
3       1991-04-29 2015-04-21        N
3       2015-04-22                   Y
4       2005-02-15                   Y
4       2005-02-15                   N

У меня есть набор данных, который выглядит примерно так, как указано выше (но гораздо больше).Я хотел бы создать новый столбец с именем Any_Disability.

Способ, которым я хочу это сделать, состоит в том, чтобы сгруппировать по UPRN, Start.Date и End.Date, и если какая-либо строка в этой группе имеет инвалидность, тогда обе строки будут иметь «Y» для Any_Disability.

Я уже пробовал:

library(dplyr)

test3<-all_data%>%
  group_by(UPRN, Start.Date, End.Date)%>%
  mutate(Any_Disability = ifelse(Disability=="Y", "Y","N"))

Но это не работает, так как дает ответ ниже:

UPRN    Start.Date  End.Date  Disability  Any_Disability
1       2006-12-20 17-NOV-17         Y          Y
1       2006-12-20 17-NOV-17         N          N
2       1991-12-06                   N          N
2       1991-12-06                   N          N
3       1991-04-29 2015-04-21        N          N
3       2015-04-22                   Y          Y
4       2005-02-15                   Y          Y
4       2005-02-15                   N          N

Воспроизводимый код:

UPRN<-c(1,1,2,2,3,3,4,4)
Start.Date<-c("2006-12-20","2006-12-20", "1991-12-06","1991-12-06","1991-04-29", "2015-04-22","2005-02-15", "2005-02-15")
End.Date<-c("17-NOV-17", "17-NOV-17", "","", "2015-04-21", "", "", "")
Disability<-c("Y","N","N","N","N","Y","Y","N")

dataset <- data.frame(UPRN, Start.Date, End.Date, Disability)

Ответы [ 2 ]

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

База R, с использованием ave и 'Y' > 'N' ... TRUE

dataset_new <- within(dataset, 
    Any_Disability <- ave(Disability, paste0(UPRN, "#", Start.Date, "#", End.Date), 
        FUN = max)
    )

# UPRN Start.Date   End.Date Disability Any_Disability
#    1 2006-12-20  17-NOV-17          Y              Y
#    1 2006-12-20  17-NOV-17          N              Y
#    2 1991-12-06                     N              N
#    2 1991-12-06                     N              N
#    3 1991-04-29 2015-04-21          N              N
#    3 2015-04-22                     Y              Y
#    4 2005-02-15                     Y              Y
#    4 2005-02-15                     N              Y

Вы можете написать FUN = function(x){if (any('Y' %in% x)) 'Y' else 'N'}, не используя трюк 'Y'> 'N', для того же результата.

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

Мы можем использовать any

test3<-df%>%
     group_by(UPRN, Start.Date)%>%
     dplyr::mutate(Any_Disability = ifelse(any(Disability=="Y"), "Y","N"))
test3
# A tibble: 8 x 5
# Groups:   UPRN, Start.Date [5]
   UPRN Start.Date   End.Date Disability Any_Disability
  <int>      <chr>      <chr>      <chr>          <chr>
1     1 2006-12-20  17-NOV-17          Y              Y
2     1 2006-12-20  17-NOV-17          N              Y
3     2 1991-12-06       <NA>          N              N
4     2 1991-12-06       <NA>          N              N
5     3 1991-04-29 2015-04-21          N              N
6     3 2015-04-22       <NA>          Y              Y
7     4 2005-02-15       <NA>          Y              Y
8     4 2005-02-15       <NA>          N              Y
...