我有一个数据框,包含一行,一个变量,一个开始日期和结束日期,以及一个唯一的ID:
ID Start End Var
521 12/1/14 20/1/14 46
212 2/4/13 4/4/13 91
541 17/3/14 21/3/14 76
729 11/8/14 14/8/14 232
... e.tc
我想将它转换为更传统的形式,例如输入lm样式函数,即
Date ID Var
12/1/14 521 23
19/1/14 521 23
......
26/3/14 541 76
... e.t.c
主要挑战是平均Var在相应日期的平均值,ID列可能用于执行此操作,但我不知道如何。
以前是否有人这样做过,知道这样做的方法还是认为不可能?
答案 0 :(得分:2)
要获得天数差异,首先必须将Start
和End
转换为POSIXct
的日期格式。然后你可以转换为星期,除以7。
给出(假设dd
是您的data.frame):
dd$Start = as.POSIXct(cc, format="%d/%m/%y")
dd$End = as.POSIXct(cc, format="%d/%m/%y")
dd$Ellapsed = as.numeric(dd$End - dd$Start) / 7
dd$Var = dd$Var / dd$Ellapsed
dd = dd[c("Ellapsed", "ID", "Var")]
答案 1 :(得分:2)
要以lm
一种方式处理日期,请先将日期转换为as.POSIXct
类型:
数据强>
df <- read.table(header=T, text='ID Start End Var
521 12.1.14 14.1.14 47
212 2.4.13 4.4.13 91
541 17.3.14 21.3.14 76
729 11.8.14 14.8.14 232')
<强>解决方案强>
例如,仅在模型中使用“开始”:
df$Start <- as.POSIXct(df$Start, format='%d.%m.%Y')
<强>输出强>
> lm(Var ~ Start, data=df)
Call:
lm(formula = Var ~ Start, data = df)
Coefficients:
(Intercept) Start
1.597e+05 2.585e-06
另一种方法是使用专门用于时间序列的zoo
包。
要以lm
一种方式处理日期,请先将日期转换为as.POSIXct
类型:
数据强>
df <- read.table(header=T, text='ID Start End Var
521 12.1.14 14.1.14 47
212 2.4.13 4.4.13 91
541 17.3.14 21.3.14 76
729 11.8.14 14.8.14 232')
<强>解决方案强>
例如,仅在模型中使用“开始”:
df$Start <- as.POSIXct(df$Start, format='%d.%m.%y')
<强>输出强>
> lm(Var ~ Start, data=df)
Call:
lm(formula = Var ~ Start, data = df)
Coefficients:
(Intercept) Start
1.597e+05 2.585e-06
另一种方法是使用专门用于时间序列的zoo
包。
修改强>
所以你需要平均数周。然后,您可以执行以下操作:
#These need to be POSIXct
df$Start <- as.POSIXct(df$Start, format='%d.%m.%y')
df$End <- as.POSIXct(df$End, format='%d.%m.%y')
#calculate the difference of start and End Dates in weeks
df$diff <- as.numeric((df$End - df$Start)/7)
#divide Var by the diff column calculated above
df$averaged_var <- df$Var / df$diff
根据需要使用上面的averaged_var
运行回归。