我的数据框看起来像:
Subject = c(1,1,1,1,2,2,2,2)
OBS = c(1.3,2.4,3.3,4.2,1.2,2.7,3.6,4.9)
REFDATE = as.Date(c('2013-09-25', '2013-09-25', '2013-09-26', '2013-09-26', '2013-09-27', '2013- 09-27', '2013-09-30', '2013-09-30'))
df1 = data.frame(Subject, OBS, REFDATE)
我想添加一个新列(REFDATE2),它只包含每个主题的最早REFDATE,产生这个:
Subject = c(1,1,1,1,2,2,2,2)
OBS = c(1.3,2.4,3.3,4.2,1.2,2.7,3.6,4.9)
REFDATE = as.Date(c('2013-09-25', '2013-09-25', '2013-09-26', '2013-09-26', '2013-09-27', '2013- 09-27', '2013-09-30', '2013-09-30'))
REFDATE2 = as.Date(c('2013-09-25', '2013-09-25', '2013-09-25', '2013-09-25', '2013-09-27', '2013- 09-27', '2013-09-27', '2013-09-27'))
df2 = data.frame(Subject, OBS, REFDATE, REFDATE2)
数据集中有相当多的主题。我怀疑某种循环函数可以确定最早的日期会起作用吗?
非常感谢任何帮助。
Sincerily,
YKL
答案 0 :(得分:3)
或使用data.table
包(也很简单快捷)
library(data.table)
df1 <- as.data.frame(data.table(df1)[, REFDATE2:= min(REFDATE), by = Subject])
df1
# Subject OBS REFDATE REFDATE2
# 1 1 1.3 2013-09-25 2013-09-25
# 2 1 2.4 2013-09-25 2013-09-25
# 3 1 3.3 2013-09-26 2013-09-25
# 4 1 4.2 2013-09-26 2013-09-25
# 5 2 1.2 2013-09-27 2013-09-27
# 6 2 2.7 2013-09-27 2013-09-27
# 7 2 3.6 2013-09-30 2013-09-27
# 8 2 4.9 2013-09-30 2013-09-27
根据OP请求,如果您想添加时间,而不是as.Date
执行as.POSIXct
,请执行以下操作:
Subject = c(1,1,1,1,2,2,2,2)
OBS = c(1.3,2.4,3.3,4.2,1.2,2.7,3.6,4.9)
REFDATE = as.POSIXct(c('2013-09-25 08:30:00', '2013-09-25 08:30:00', '2013-09-26 08:30:00', '2013-09-26 08:30:00', '2013-09-27 08:30:00', '2013-09-27 08:30:00', '2013-09-30 08:30:00', '2013-09-30 08:30:00'))
df1 = data.frame(Subject, OBS, REFDATE)
library(data.table)
df1 <- as.data.frame(data.table(df1)[, REFDATE2:= min(REFDATE), by = Subject])
df1
# Subject OBS REFDATE REFDATE2
# 1 1 1.3 2013-09-25 08:30:00 2013-09-25 08:30:00
# 2 1 2.4 2013-09-25 08:30:00 2013-09-25 08:30:00
# 3 1 3.3 2013-09-26 08:30:00 2013-09-25 08:30:00
# 4 1 4.2 2013-09-26 08:30:00 2013-09-25 08:30:00
# 5 2 1.2 2013-09-27 08:30:00 2013-09-27 08:30:00
# 6 2 2.7 2013-09-27 08:30:00 2013-09-27 08:30:00
# 7 2 3.6 2013-09-30 08:30:00 2013-09-27 08:30:00
# 8 2 4.9 2013-09-30 08:30:00 2013-09-27 08:30:00
答案 1 :(得分:1)
使用dplyr
:
library(dplyr)
df1 %.% group_by(Subject) %.% mutate(REFDATE2=min(REFDATE))
给出了:
Source: local data frame [8 x 4]
Groups: Subject
Subject OBS REFDATE REFDATE2
1 1 1.3 2013-09-25 2013-09-25
2 1 2.4 2013-09-25 2013-09-25
3 1 3.3 2013-09-26 2013-09-25
4 1 4.2 2013-09-26 2013-09-25
5 2 1.2 2013-09-27 2013-09-27
6 2 2.7 2013-09-27 2013-09-27
7 2 3.6 2013-09-30 2013-09-27
8 2 4.9 2013-09-30 2013-09-27