Создайте новый индикатор столбца для последней даты в каждой группе - PullRequest
0 голосов
/ 05 мая 2020

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

Я приложил образец данных ниже:

Item    Group   Date
item1   a   1/1/2019
item2   a   2/1/2019
item3   a   3/1/2019
item6   b   1/1/2019
item7   b   2/1/2019
item8   b   2/1/2019
item9   b   3/1/2019

Для каждой группы (a или б), я хочу создать индикатор, который показывает, является ли Дата последней в своей группе. Я приложил образец того, что я хочу выполнить. sh:

Item    Group   Date    Indicator
item1   a   1/1/2019    
item2   a   2/1/2019    
item3   a   3/1/2019    Latest
item6   b   1/1/2019    
item7   b   2/1/2019    
item8   b   3/1/2019    
item9   b   4/1/2019    Latest

Это мой код. Он может найти самую последнюю дату, но, похоже, не разделен по группам.

data$Indicator <- ifelse(data$Date == max(data$Date) & data$Group == "a", "Latest",
                           ifelse(data$Date == max(data$Date) & data$Group == "b", "Latest","")) 

Я понимаю, что оператор data$Date == max(data$Date) не различает guish между группами, поэтому я попытался использовать mutate, но, похоже, я неправильно его настраиваю.

data %>% 
  group_by(Group) %>% 
  mutate(Indicator = ifelse(data$Date == max(data$Date), "Latest",""))

Интересно, может ли кто-нибудь указать мне правильное направление.

1 Ответ

1 голос
/ 05 мая 2020

После изменения класса даты на дату мы можем сравнить дату со значением даты max в каждом Group и использовать ifelse для назначения Indicator.

library(dplyr)

df %>%
 mutate(Date = as.Date(Date, '%m/%d/%Y')) %>%
 group_by(Group) %>%
 mutate(Indicator = ifelse(Date == max(Date), 'Latest', ''))

# Item  Group Date       Indicator
#  <chr> <chr> <date>     <chr>    
#1 item1 a     2019-01-01 ""       
#2 item2 a     2019-02-01 ""       
#3 item3 a     2019-03-01 "Latest" 
#4 item6 b     2019-01-01 ""       
#5 item7 b     2019-02-01 ""       
#6 item8 b     2019-02-01 ""       
#7 item9 b     2019-03-01 "Latest" 

Другой подход может заключаться в arrange данных и назначении "Latest" Indicator в последней строке каждой группы.

df %>%
 mutate(Date = as.Date(Date, '%m/%d/%Y')) %>%
 arrange(Group, Date) %>%
 group_by(Group) %>%
 mutate(Indicator = ifelse(row_number() == n(), 'Latest', ''))
...