我有像
这样的数据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 - 我认为问题是没有前一行的第一行..?
答案 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)