2017-04-14 15 views
1

次のような形式の日付付きdfがあります。短い文字列の短い日付R

Date      Year 
<chr>     <dbl> 
Sunday, Jul 27   2008 
Tuesday, Jul 29   2008 
Wednesday, July 31 (1) 2008 
Wednesday, July 31 (2) 2008 

次の列と値の形式を実現する簡単な方法はありますか?私はまた、7月2日の2つの日に(1)と(2)の表記を削除したいと思います。

Date   Year Month Day Day_of_Week 
2008-07-27 2008 07  27  Sunday 
+1

あなたは、私は多くの柔軟性を持っているlubridateパッケージになります日付操作の多くを行うとしている場合。 – Elin

+0

dput()バージョンのような構造体を投稿する必要があります(正確に再作成するのが難しいでしょう)。 –

答えて

2
library(dplyr) 
library(lubridate) 
dat = data_frame(date = c('Sunday, Jul 27','Tuesday, Jul 29', 'Wednesday, July 
31 (1)','Wednesday, July 31 (2)'), year=rep(2008,4)) 

dat %>% 
    mutate(date = gsub("\\s*\\([^\\)]+\\)","",as.character(date)), 
      date = parse_date_time(date,'A, b! d ')) -> dat1 
      year(dat1$date) <- dat1$year 

# A tibble: 4 × 2 
     date year 
     <dttm> <dbl> 
1 2008-07-27 2008 
2 2008-07-29 2008 
3 2008-07-31 2008 
4 2008-07-31 2008 
+0

実際に必要なパッケージのみに 'library'ロードを減らしてください。 'tidyverse'は便利なスーパーパッケージであり、ここでは不要な多くのパッケージを取り込むことができます。この場合、私はそれが 'dplyr'(そして' lubridate')と思う。 – r2evans

+0

興味深いことに、あなたは彼の質問から注釈を「出す」ことを選択しました。私はそれを行うとは考えていませんでした。問題を完全に/完全に再現性のあるものに保ちます。 – r2evans

+0

私はtidyverseが個々のパッケージのどれかを使い切ってしまったので、関係するパッケージだけを使うことは考えていませんでした。 –

4

ベースRを使用すると、行うことができます:

dat <- data.frame(
    Date = c("Sunday, Jul 27" ,"Tuesday, Jul 29", "Wednesday, July 31", "Wednesday, July 31"), 
    Year = rep(2008, 4), 
    stringsAsFactors = FALSE 
) 


dts <- as.POSIXlt(paste(dat$Year, dat$Date), format = "%Y %A, %B %d") 

POSIXltは、日付/時刻のためのリストベースのリファレンスを提供します。それらを表示するには、unclass(dts[1])を試してください。ここから

それは学術むしろことができます。

dat$Month = 1 + dts$mon # months are 0-based in POSIXlt 
dat$Day = dts$mday 
dat$Day_of_Week = weekdays(dts) 
dat 
#     Date Year Month Day Day_of_Week 
# 1  Sunday, Jul 27 2008  7 27  Sunday 
# 2 Tuesday, Jul 29 2008  7 29  Tuesday 
# 3 Wednesday, July 31 2008  7 31 Thursday 
# 4 Wednesday, July 31 2008  7 31 Thursday 
+0

私は単純な月、日、曜日の計算のためにあなたのコードを上記のlubridateソリューションと組み合わせることになりました。助けてくれてありがとう! –

関連する問題