2016-12-03 5 views
1

日付が "mm/dd/yyyy"または " yyyy-mm-dd」となります。それらはまずは始めるべき要素です。私はそれを受け取る日付のフォーマットに関係なく、私はフォーマット "yyyy-mm-dd"の 'Date'データタイプに変換できるようにしたい。私は、これはフォーマット "YYYY-MM-DD" で動作しますが、入力値はフォーマットであるとき、NAを与える "YYYY/MM/DD"入力値が異なる形式の場合、Rの "yyyy-mm-dd"の形式に変換する方法

df_1$Date <- as.Date(as.character(df_1$Date), format = "%Y-%m-%d")

を使用して試してみました。同様に、私が試した他の方法は、これらの2つのフォーマットのうちの1つのみで動作します。 私は両方のためにそれが必要です。

以下、データセットを作成して問題を複製するためのコードを掲載しました。

df_1 <- structure(list(Text.Identifier = c(4L, 5L, 7L, 1838L), Date = structure(c(2L, 
                     2L, 1L, 3L), .Label = c("5/18/2016", "7/12/2015", "8/29/2016" 
                    ), class = "factor")), .Names = c("Text.Identifier", "Date"), class = "data.frame", row.names = c(NA, 
                                             -4L)) 

df_2 <- structure(list(Text.Identifier = 1:4, Date = structure(c(5L, 
                5L, 5L, 1L), .Label = c("2015-07-12", "2016-05-01", "2016-05-05", 
                      "2016-05-09", "2016-05-12", "2016-05-18", "2016-08-01", "2016-08-19", 
                      "2016-08-29", "2016-09-20"), class = "factor")), .Names = c("Text.Identifier", 
                                     "Date"), row.names = c(NA, 4L), class = "data.frame") 

df_1$Date <- as.Date(df_1$Date, format = "%Y-%m-%d") 
df_2$Date <- as.Date(df_2$Date, format = "%Y-%m-%d") 
View(df_1) 
View(df_2) 
+2

'lubridate'パッケージの' parse_date_time'をチェックしてください。また、あなたの思考を、あなたの考えをどのようなクラスで扱っているのかがより重要なところにある、より多くのRの考え方に徹底的に取り組むことができます。 – boshek

+0

潜在的な複製から7時間前http://stackoverflow.com/a/40940164/5472462この質問に非常によく答えます。 – vincentmajor

+0

[Rの正しいas.Date形式を自動的に適用する関数]の重複可能性があります(http://stackoverflow.com/questions/40940016/function-to-automatically-apply-correct-as-date-format-in-r) – vincentmajor

答えて

1

あなたは2つのだけの日付形式は "YYYY/MM/DD" または "YYYY-MM-DD" であることを確認している場合、これは動作するはずです。このソリューションでは、grepを使用して日付のスラッシュを検索し、その日付を「mm/dd/yyyy」から「yyyy-mm-dd」に変換します。ここで

は一例です:

dates <- data.frame(date = c("2015-11-01", "12/12/2016", "1992-05-28", "03/05/2011"), stringsAsFactors = FALSE) 

dates$date[grep("/", dates$date)] <- as.character(as.Date(dates$date[grep("/", dates$date)], "%m/%d/%Y")) 
+0

あなたは 'stringsAsFactors = FALSE'を使用していますが、OPは要因が日付として保存されていると述べています。 – RHertel

1

私はanytimeライブラリからanydate()機能を使用することをお勧め。 lubridateparse_date_time()よりもこのケースに適しています。これは、またはdmyのように、エントリの順序に関するユーザーの入力を必要とせずに日付を認識するためです。さらに、データが要素として格納されていれば問題はありません。

はここに例を示します

my_dates <- c("2015-07-12", "2016-05-01", "2016-05-05", "2016-05-09", 
"2016-05-12", "2016-05-18", "2016-08-01", "2016-08-19", "2016-08-29", 
"2016-09-20", "5/18/2016", "7/12/2015", "8/29/2016") 
my_dates <- as.factor(my_dates) 
library(anytime) 
anydate(my_dates) 
# [1] "2015-07-12" "2016-05-01" "2016-05-05" "2016-05-09" "2016-05-12" "2016-05-18" 
# [7] "2016-08-01" "2016-08-19" "2016-08-29" "2016-09-20" "2016-05-18" "2015-07-12" 
#[13] "2016-08-29 

一つは、別の投稿ソリューションが不要なタイムゾーン情報とPOSIXオブジェクトを生成するのに対し、出力のクラスは確かにDate

class(anydate(my_dates)) 
#[1] "Date" 

であることを確認することができます。

1

私のコメントを回答として追加することで、この質問に回答することができます。

lubridateパッケージは、異なる日付区切り文字と異なる日付の注文を選択するのに十分スマートです。

library(lubridate) 
data = c("01-12-2000", "02-11-2001", "2016-06-20", "2016-12-05") 
parse_date_time(data, c('dmy', 'ymd')) 

## returns 
## [1] "2000-12-01 UTC" "2001-11-02 UTC" "2016-06-20 UTC" "2016-12-05 UTC" 
関連する問題