5

私はこれから行く必要があります

 id  |    date
-----------------
  A  | 2000-01-13
  A  | 2000-01-18
  A  | 2000-01-25
  B  | 2012-10-10
  B  | 2012-10-11
  C  | 2005-07-25
  C  | 2005-07-31

これに

 id  |    date     | days from start
---------------------------
  A  | 2000-01-13  |  0
  A  | 2000-01-18  |  5
  A  | 2000-01-25  |  12
  A  | 2000-02-08  |  26
  B  | 2012-10-10  |  0
  B  | 2012-10-11  |  1
  C  | 2005-07-25  |  0
  C  | 2005-07-31  |  6

つまり、最初の日付から経過した日数を ID でグループ化して保持する変数を作成します。

何か案は?

4

3 に答える 3

10

data.table: (ここでは列が文字であると仮定しdateます。その形式の場合、関数呼び出しdateを削除できます。as.Date(.)

df <- structure(list(id = c("A", "A", "A", "B", "B", "C", "C"), 
             date = c("2000-01-13", "2000-01-18", "2000-01-25", "2012-10-10", 
                    "2012-10-11", "2005-07-25", "2005-07-31")), 
             .Names = c("id", "date"), row.names = c(NA, -7L), 
             class = "data.frame")
require(data.table)
dt <- data.table(df, key="id")
dt[, days_from_start := cumsum(c(0, diff(as.Date(date)))),by=id]

#    id       date days_from_start
# 1:  A 2000-01-13               0
# 2:  A 2000-01-18               5
# 3:  A 2000-01-25              12
# 4:  B 2012-10-10               0
# 5:  B 2012-10-11               1
# 6:  C 2005-07-25               0
# 7:  C 2005-07-31               6
于 2013-01-21T10:30:34.487 に答える
5

関数difftimeと を組み合わせて使用​​することもできsplitます。

dat
  id       date
1  A 2000-01-13
2  A 2000-01-18
3  A 2000-01-25
4  B 2012-10-10
5  B 2012-10-11
6  C 2005-07-25
7  C 2005-07-31

dat$date <- as.POSIXct(dat$date)
dat$"Days spent" <- unlist(lapply(split(dat,f=dat$id),
                         function(x){as.numeric(difftime(x$date,x$date[1], units="days"))}))
dat
  id       date Days spent
1  A 2000-01-13          0
2  A 2000-01-18          5
3  A 2000-01-25         12
4  B 2012-10-10          0
5  B 2012-10-11          1
6  C 2005-07-25          0
7  C 2005-07-31          6

@agstudy と @Arun の提案に従って、これは次のように簡略化できます。

dat$"Days spent" <- unlist(by(dat, dat$id, 
                           function(x)difftime(x$date,x$date[1], units= "days")))
于 2013-01-21T10:33:14.370 に答える
0

他の2つのアプローチ:aveおよびplyrライブラリの使用:

df <-
structure(list(id = c("A", "A", "A", "B", "B", "C", "C"), date = structure(c(10969, 
10974, 10981, 15623, 15624, 12989, 12995), class = "Date")), .Names = c("id", 
"date"), row.names = c(NA, -7L), class = "data.frame")

を使用しaveて、日付を数値に変更する必要があります

df$days_from_start <- ave(as.numeric(df$date), df$id, FUN = function(x) x-min(x))

を与える

> df
  id       date days_from_start
1  A 2000-01-13               0
2  A 2000-01-18               5
3  A 2000-01-25              12
4  B 2012-10-10               0
5  B 2012-10-11               1
6  C 2005-07-25               0
7  C 2005-07-31               6
> str(df)
'data.frame':   7 obs. of  3 variables:
 $ id             : chr  "A" "A" "A" "B" ...
 $ date           : Date, format: "2000-01-13" ...
 $ days_from_start: num  0 5 12 0 1 0 6

plyrライブラリの使用:

library("plyr")
df <- ddply(df, .(id), mutate, days_from_start = date - min(date))

を与える

> df
  id       date days_from_start
1  A 2000-01-13          0 days
2  A 2000-01-18          5 days
3  A 2000-01-25         12 days
4  B 2012-10-10          0 days
5  B 2012-10-11          1 days
6  C 2005-07-25          0 days
7  C 2005-07-31          6 days
> str(df)
'data.frame':   7 obs. of  3 variables:
 $ id             : chr  "A" "A" "A" "B" ...
 $ date           : Date, format: "2000-01-13" ...
 $ days_from_start:Class 'difftime'  atomic [1:7] 0 5 12 0 1 0 6
  .. ..- attr(*, "units")= chr "days"
于 2013-01-22T23:03:17.987 に答える