【发布时间】:2015-05-30 05:04:01
【问题描述】:
我收到了一个 Stata 数据文件 (counts.dta),其中包含 1975 年至 2006 年以宽格式存储的每日计数。这些列标记为月份(作为字符串的月份的全名)、日期(数值为 1-31 的数字),然后是从 1975 年到 2006 年的年份,标签为 '_1975'、'_1976' ... '_2006' .我认为下划线是Stata中某些东西的结果。当年份列不是闰年时,为 2 月 29 日的日期插入了零 (0) 的虚拟计数。
我想做几件事。首先,将年份转换为具有合理表示的长格式。其次,将日期的三方表示改为更合理的方式。
我的方法是将字符串月份更改为一个因子,然后将其调整为正确的顺序:
require("foreign")
counts <- read.dta(file='counts.dta')
counts[['month']] <- as.factor( counts[['month']] )
counts[['month']] <-
factor(counts[['month']], levels( counts[['month']] )[c(5,4,8,1,9,7,6,2,12,11,10,3)])
然后我有
str( counts )
'data.frame': 366 obs. of 34 variables:
$ month: Factor w/ 12 levels "January","February",..: 1 1 1 1 1 1 1 1 1 1 ...
$ day : int 1 2 3 4 5 6 7 8 9 10 ...
$ _1975: int 515 649 745 599 445 667 725 749 646 740 ...
$ _1976: int 485 685 529 467 630 723 712 685 715 504 ...
$ _1977: int 505 437 489 588 634 734 682 537 453 673 ...
等等。转换为长格式
lcounts <- reshape(counts,
direction="long",
varying=list(names( counts )[3:34]),
v.names="n.counts",
idvar=c("month","day"),
timevar="Year",
times=1975:2006)
str( lcounts )
给予
'data.frame': 11712 obs. of 4 variables:
$ month : Factor w/ 12 levels "January","February",..: 1 1 1 1 1 1 1 1 1 1 ...
$ day : int 1 2 3 4 5 6 7 8 9 10 ...
$ Year : int 1975 1975 1975 1975 1975 1975 1975 1975 1975 1975 ...
$ n.counts: int 515 649 745 599 445 667 725 749 646 740 ...
加上一些与原始Stata文件相关的更多行。
我的问题是:(1) 现在有什么好方法可以将因子月份、数字年份和数字日期转换为有用的日期格式,以便我可以确定例如星期几,两个日期之间的间隔等等? (2) 有没有更好的方法从一开始就解决这个问题?
【问题讨论】:
-
@ExperimenteR OP 已经在 R 中加载了数据。该建议无助于解决所提出的实际问题。
-
@Thomas 我支持诸如 ExperimeteR 之类的 cmets,这些 cmets 可能对附近地区有所帮助,即解决与发布的问题非常相似但不完全相同的问题。自然,仍然有一个关于在哪里划定界限的判断要求,但 OP 确实在他们的 (2) 下要求更广泛的评论,考虑到一个提供具体细节的主要问题,这似乎是合理的。
标签: r date import dataframe stata