Агрегирование столбцов путем нахождения разницы между 2 датами в г - PullRequest
0 голосов
/ 08 сентября 2018

Мне нужно использовать функцию агрегирования, чтобы уменьшить таблицу 1 ниже до таблицы 2 путем нахождения разницы в max (дата окончания) и min (дата начала) для каждого идентификатора. Я пробовал несколько кодов, но это последний;

Table2<-aggregate(table1$date,by=list(table1$ID),FUN=diff)
as.numeric(Table2)

   #Table1
       ID      Date
    1  100 1/10/1999
    2  100 1/10/1999
    3  100  4/7/2000
    4  100  4/8/2000
    5  100  3/7/2001
    6  110  3/8/2001
    7  110  4/8/2002
    8  110  4/6/2003
    9  110  4/7/2003
    10 110  3/6/2005

Желаемый результат

Table 2
ID  length(days)
100  788
110  1459

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Base R и aggregate сделают это легко.
Но сначала приведите ваш Date столбец к классу Date.

table1$Date <- as.Date(table1$Date, "%m/%d/%Y")

aggregate(Date ~ ID, table1, function(x) x[length(x)] - x[1])
#   ID  Date
#1 100  787 
#2 110 1459

Данные.

table1 <- read.table(text = "
ID      Date
1  100 1/10/1999
2  100 1/10/1999
3  100  4/7/2000
4  100  4/8/2000
5  100  3/7/2001
6  110  3/8/2001
7  110  4/8/2002
8  110  4/6/2003
9  110  4/7/2003
10 110  3/6/2005
", header = TRUE)
0 голосов
/ 09 сентября 2018

Вот подход с dplyr, предполагая, что вы уже преобразовали Дата в поле типа даты, согласно ответу Руи.

library(dplyr)
summary <- table1 %>%
  group_by(ID) %>%
  summarize(min = min(Date),
            max = max(Date)) %>%
  mutate(range = max - min + 1)

summary
# A tibble: 2 x 4
     ID min        max        range 
  <int> <date>     <date>     <time>
1   100 1999-01-10 2001-03-07 788   
2   110 2001-03-08 2005-03-06 1460  
0 голосов
/ 08 сентября 2018

Пожалуйста, предоставьте свой собственный код, данные и желаемый вывод, чтобы получить наиболее полезные для вас ответы ...

Ниже представлен подход data.table, который рассчитывает длительность для каждого идентификатора на основе первой и последней записи каждой группы идентификаторов.

library( data.table )

df <- data.frame( date = c(as.Date("2018-01-01"), as.Date("2018-02-04"), as.Date("2018-01-02"), as.Date("2018-02-04") ),
                  id = c(100,100,110,110),
                  stringsAsFactors = FALSE)

df
#         date  id
# 1 2018-01-01 100
# 2 2018-02-04 100
# 3 2018-01-02 110
# 4 2018-02-04 110

setDT(df)[, difftime( date[.N], date[1] ), by = id][]
#     id      V1
# 1: 100 34 days
# 2: 110 33 days
...