簡體   English   中英

R.處理導入的Stata文件中的日期和寬格式

[英]R. Handling dates and wide format from an imported Stata file

我得到了一個Stata數據文件(counts.dta),其中包含以寬格式存儲的1975年至2006年的每日計數。 這些列分別標記為月(以字符串表示的月全名),日期(值為1-31的數字),然后標記為_1975,_1976和..._ 2006的1975年至2006年。 。 我認為下划線是Stata中某些情況的結果。 如果年份列不是when年,則在日期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)是否有更好的方法從一開始就解決問題?

這應該很容易,因為您要做的就是將data.frame的行粘貼在一起,並使用as.Date創建Date類向量。

讓我們從一些類似於您的數據開始:

dat <- data.frame(month = c(rep("January",31), rep("February",29)),
                  day = c(1:31, 1:29),
                  Year = 1975,
                  n.counts = 515)

那么創建date變量很簡單:

dat$Date <- as.Date(with(dat, paste(as.numeric(month), day, Year)), "%m %d %Y")
str(dat)
# 'data.frame':   60 obs. of  5 variables:
#  $ month   : Factor w/ 2 levels "February","January": 2 2 2 2 2 2 2 2 2 2 ...
#  $ day     : int  1 2 3 4 5 6 7 8 9 10 ...
#  $ Year    : num  1975 1975 1975 1975 1975 ...
#  $ n.counts: num  515 515 515 515 515 515 515 515 515 515 ...
#  $ Date    : Date, format: "1975-02-01" "1975-02-02" "1975-02-03" "1975-02-04" # ...

自然地,該線程的主要焦點是在導入數據后在R中要做的事情,但是在這里,我將其Stata方面的各種細節捆綁在一起。

這是長期的建議,這樣的數據在Stata更容易處理的長形並reshape long是一個標准的命令做在一個單獨的變量,每年的數據到達數據轉換(R用戶:請閱讀“欄目”)。 因此,如果可能,應在導出之前請此類Stata文件的提供者執行此操作。

OP稱為_1975類的標簽是Stata中的合法變量名稱,並且OP猜測需要使用下划線,因為Stata中的變量名稱可能不能以數字字符開頭。

根據給定的信息,可以以.dta以外的其他文件格式(尤其是通常的文本文件( .csv等))導出數據而不會從Stata丟失。

Stata首選的每日日期保存方式是將原點0設為1960年1月1日(因此2015年3月26日為20173),這很容易轉換為R中的任何日期表示形式。

簡而言之,任何Stata語法都不需要或沒有推薦給OP呈現的特定且確實特殊的數據形式,甚至不建議將其作為良好的Stata實踐的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM