根据R中其他列中的最早日期值创建新列

时间:2014-04-22 08:50:14

标签: r

我的数据框看起来像:

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

2 个答案:

答案 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