2016-07-23 104 views
2

我會認爲這應該是一個非常容易解決;但是,我在這裏找不到它;而且,我在其他地方找到的說明沒有奏效。我想要做的就是使用簡單的粘貼功能。粘貼功能在r

以我的數據幀,我有一個日期變量格式化「YYMMDD」:

> str(g.2015.1990$DATE) 
int [1:60464] 150410 150411 150412 150420 150421 150422 150423 150424 150425 150426 ... 

ř將此解釋爲一個整數,但是我需要將其格式化爲一個日期。當我進入2000 - 2009年的時候,我的問題就出現了。 R下降領先的0。因此,2001 - 2009年的格式是「ymmdd」; 2000年10月至12月格式化爲「mmdd」;並且,2000年1月至9月格式化爲「mdd」。

我想我可以將矢量分成四個部分(我必須逐年對它進行組裝),然後根據需要在前面粘貼無,一,二或三個0創建一個一致的6位字符串,然後我可以將其轉換爲日期。

我還沒有花時間把這個變量分解到前面提到的部分,因爲我還沒有找到成功解決我的問題的方法;然而,這裏就是我的全部的變量進行了測試:

datex = paste("0", g.2015.1990$DATE, sep = "") 
datex = paste(0, g.2015.1990$DATE, sep = "") 
datex = paste("0", as.character(g.2015.1990$DATE), sep = "") 
datex = paste(0, as.character(g.2015.1990$DATE), sep = "") 

每一個返回相同的錯誤:

Error in View : 'names' attribute [1254] must be the same length as the vector [1] 

請告訴我,我在做什麼錯了!我發誓,這應該是如易於修復。

回答

1

to create a consistent, 6-digit character string that I can then convert to a date.

因此,你需要:

datex <- sprintf("%06d", g.2015.1990$DATE) 
## formatted string: 6-digit integer, padding 0 ahead 

sprintf("%06d", 150410) ## 2015-04-10 
# "150410" 

sprintf("%06d", 90410) ## 2009-04-10 
# "090410" 

sprintf("%06d",410) ## 2000-04-10 
[1] "000410" 

如果你以後想datex轉換爲Date對象,這樣做:

datex <- as.Date(datex, "%y%m%d") 

as.Date("150410", "%y%m%d") 
# [1] "2015-04-10" 

as.Date("090410", "%y%m%d") 
# [1] "2009-04-10" 

as.Date("000410", "%y%m%d") 
# [1] "2000-04-10" 
+0

這個工程如果數據是性格,具有領先的零。但是海報有整數沒有前導零。 '格式(as.Date(090410,「%y%m%d」),「%Y-%m-%d」)' 'charToDate(x)中的錯誤: 字符串不是標準的明確格式' – billspat

+0

感謝您的幫助!你的解決方案在邏輯上是合理的;不幸的是,我仍然有問題: > datex < - sprintf(「%06d」,g.2015。1990 $ DATE) >查看(DATEX) 錯誤在檢視:「名稱」屬性[1186]必須是相同的長度作爲矢量[1] 這是我以前得到同樣的錯誤。有關如何解決它的任何建議? –

+1

好的,它看起來像我可以使用它,但沒有看到它......我不明白R.我想,問題雖然解決了!謝謝您的幫助。 –

2

你要sprintf()這裏,而不是paste。然後你可以使用任何日期轉換FUNC,但我喜歡lubridate

# say you have 2009-10-11 and 2010-10-11, but yymmdd and numeric, so leading 
# 0 is dropped on '09... 
your_vec <- c(91011, 101011) 

# convert to 6 char string (result: "091011" "101011") 
new_vec <- sprintf('%06d', your_vec) 

# but if you must use paste... (same result: "091011" "101011") 
ifelse(nchar(your_vec) == 5, paste0('0', your_vec), your_vec) 

# either way, now you can make it a date 
library(lubridate) 
ymd(new_vec) 

# result: 
# "2009-10-11 UTC" "2010-10-11 UTC" 

(我拿起新的示例數據,因爲你的上面實際上並沒有丟失的前導零的問題)

+0

感謝您的幫助!你的解決方案在邏輯上是合理的;不幸的是,我仍然有問題: > datex < - sprintf(「%06d」,g.2015.1990 $ DATE) >查看(datex) 查看錯誤:'names'屬性[1186]必須相同長度作爲矢量[1] 這是我以前得到的同樣的錯誤。有關如何解決它的任何建議? –