2017-02-06 30 views
-1

Вот мой df (data.frame):разница Вычислить в датах (в днях) между группой А и строки над ней для каждого идентификатора

 id group  date 
[1] 1  B 2000-01-01 
[2] 1  B 2001-02-11 
[3] 1  A 2001-04-06 
[4] 2  C 2000-02-01 
[5] 2  A 2001-01-01 
[6] 2  B 2004-11-12 
    ... 

data.frame был организован и идентификатором Дата. Я хотел бы рассчитать разницу в датах (в днях) между группой А и строкой над ней для каждого идентификатора. По моим данным, каждая группа A имеет строку над ней для одного и того же идентификатора.

Результаты, Я Заинтересованность в будет выглядеть как этот

 id  days 
[1] 1  54 
[2] 2  335 
    ... 

Пожалуйста посоветуйте

Спасибо.

+0

Пожалуйста, всегда указывайте лучший ответ для вас с тегом «ответ», если один ответ решает ваш вопрос в соответствии с запросом, чтобы закрыть вопрос и документировать результат. THX :-) –

ответ

1

Вот идея использования dplyr

library(dplyr) 

#make sure "date" has the appropriate class 
df$date <- as.POSIXct(df$date, format = '%Y-%m-%d') 

df %>% 
group_by(id) %>% 
mutate(diff1 = c(NA, round(diff.difftime(date, units = 'days')))) %>% 
filter(group == 'A') %>% 
select(id, diff1) 

#Source: local data frame [2 x 2] 
#Groups: id [2] 

#  id diff1 
# <int> <dbl> 
#1  1 54 
#2  2 335 
2

Поскольку это уже отсортирован, вы можете просто сделать:

dft %>% 
    group_by(id) %>% 
    mutate(diff_days = difftime(date, lag(date))) %>% 
    filter(group == "A") %>% 
    select(diff_days) 

, который дает:

 id diff_days 
    <int> <time> 
1  1 54 days 
2  2 335 days 
+0

@Sotos nope. не заметил вашего ответа во время публикации. Я признаю, что ваш код более надежный. :) – Aramis7d

0

Мы можем использовать data.table

library(data.table) 
setDT(df)[, diff1 := c(NA, round(diff.difftime(date, 
    units = 'days'), 0)), id][group=="A"][, c("id", "diff1"), with = FALSE] 
# id diff1 
#1: 1 54 
#2: 2 335 

 Смежные вопросы

  • Нет связанных вопросов^_^