计算数据框中不同主题的时间轴

时间:2018-02-16 13:58:37

标签: r

我有像

这样的数据
subject    date   number
1         1/2/01 4
1         3/2/01 6
1         10/2/01 7
2         1/1/01  2
2         4/1/01  3

我想让R计算出自每个主题的第一个样本以来的天数。例如:

Subject    days
1          0
1          2
1          9
2          0
2          3

我该怎么做?我已经使用lubridate转换了日期。

类似的东西:

for(i in 1:nrow(data)){
    if(data$date[i] != data$date[i -1]) {
        data$timeline <- data$date[i] - data$date[i-1]
    }
}

我收到错误: 参数的长度为0 - 我认为问题是没有前一行的第一行..?

2 个答案:

答案 0 :(得分:1)

我会使用dplyr进行一些分组和数据操作。请注意,我们首先必须将您的日期转换为R将识别为日期的内容。

library(dplyr)
dat$Date <- as.Date(dat$date, '%d/%m/%y')

dat %>%
    group_by(subject) %>%
    mutate(days = Date - min(Date))

#   subject date    number Date       days  
#     <int> <chr>    <int> <date>     <time>
# 1       1 1/2/01       4 2001-02-01 0     
# 2       1 3/2/01       6 2001-02-03 2     
# 3       1 10/2/01      7 2001-02-10 9     
# 4       2 1/1/01       2 2001-01-01 0     
# 5       2 4/3/01       3 2001-03-04 62    

这里是数据:

dat <- structure(list(subject = c(1L, 1L, 1L, 2L, 2L), date = c("1/2/01", 
"3/2/01", "10/2/01", "1/1/01", "4/3/01"), number = c(4L, 6L, 
7L, 2L, 3L), Date = structure(c(11354, 11356, 11363, 11323, 11385
), class = "Date")), .Names = c("subject", "date", "number", 
"Date"), row.names = c(NA, -5L), class = "data.frame")

答案 1 :(得分:1)

使用注释中显示的输入将日期列转换为Date类(假设它的格式为dd / mm / yy),然后使用ave从每个日期的所有日期中减去最小日期学科。如果输入按问题排序,我们可以选择使用x[1]而不是min(x)。没有包使用。

data$date <- as.Date(data$date, "%d/%m/%y")
diff1 <- function(x) x - min(x)
with(data, data.frame(subject, days = ave(as.numeric(date), subject, FUN = diff1)))

,并提供:

  subject days
1       1    0
2       1    2
3       1    9
4       2    0
5       2   62

注意

以可重复的形式使用的输入是:

Lines <- "
subject    date   number
1         1/2/01 4
1         3/2/01 6
1         10/2/01 7
2         1/1/01  2
2         4/3/01  3"
data <- read.table(text = Lines, header = TRUE)