質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
date

dateは、date型や日付に関する関数や処理についてのタグです

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

3回答

790閲覧

<R> 時系列データの取り扱い 桁数が異なる場合 例:202008 >20200801などへの補正

mourinho384

総合スコア8

date

dateは、date型や日付に関する関数や処理についてのタグです

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2020/08/19 13:18

前提・実現したいこと

現在、Rのデータテーブルで時系列データを扱おうと思っているのですが、
20200820のようにyyyymmddの形で記載あるものもあれば、
202008 のように月までの形や
2020  で年しか書いていないものも混在しています。

ひとまず月日がわからないものはそれぞれの最初の月日で補正したいのですが、わからずに困っています。

(202008 >20200801 / 2020 >20200101)
のような補正です。

df <- data.frame(ID = as.factor(1:8),
method = as.factor(c("A","B","B", "A","A","A","A","A")),
critelia = c(1,0,0,1,NA,1,1,1),
date=c("19411222", "193002", "1944","20200820","20200811","202008","2020","NA"))%>%as.tibble

R

試したこと

lubridateを用いて行うのか、case whenで桁数(nchar())で条件分岐をするのがいいのか色々試行錯誤したのですが、わからずに困っています。
恐れ入りますが、どなたかご教示いただけないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

ifelse()を使うのが一番手っ取り早いでしょう。

a <- c("2020", "202008", "20200802", "222") b <- ifelse(nchar(a)==8, a, ifelse(nchar(a)==6, paste0(a,"01"), ifelse(nchar(a)==4, paste0(a,"0101"), NA)))
> print(b) [1] "20200101" "20200801" "20200802" NA

投稿2020/08/19 19:16

KojiDoi

総合スコア13692

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mourinho384

2020/08/19 20:35

ありがとうございます。確かに1番手っ取り早いですね!
guest

0

正規表現で置換してみてはいかがでしょう。

R

1date <- c("19411222", "193002", "1944", "20200820", "20200811", "202008", "2020") 2 3# 6文字の数字の後ろに01をつける 4date <- c(gsub("(^\d{6}$)", "\101", date)) 5 6# 4文字の数字の後ろに0101をつける 7date <- c(gsub("(^\d{4}$)", "\10101", date))
> date [1] "19411222" "19300201" "19440101" "20200820" "20200811" "20200801" "20200101"

投稿2020/08/19 14:50

technocore

総合スコア7337

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

文字列の文字数が8文字なら年月日
6文字なら年月
4文字なら年、
とするなら、

文字列の最初から4文字2文字2文字で分解していけばいいだけのはなしですね

投稿2020/08/19 13:22

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mourinho384

2020/08/19 13:49

ありがとうございます、文字列の切り出しと置換でうまくできそうです。アドバイス本当にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問