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

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

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

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

Q&A

2回答

825閲覧

月をまたいでいる場合の月ごとの合計を算出

Y_amemiya

総合スコア5

R

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

0グッド

0クリップ

投稿2021/07/08 10:38

編集2021/07/08 10:57

Rを使っているものです。

現在扱っている以下のようなデータを扱っています。

ID 使用日  使用月 使用期間(day)
1 2020-01-01 2020-01 4
2 2020-01-01 2020-01 40
3 2020-12-01 2020-12 40

このデータから、月ごとの使用日数の合計を算出したいです。
具体的には以下のようなデータに加工したいと考えています。

ID 使用日  使用月 使用期間(day)
1 2020-01-01 2020-01 4
2 2020-01-01 2020-01 31
2 2020-02 9
3 2020-12-01 2020-12 31
3 2021-01 9

IDごとに使用期間が月をまたいだ場合、翌月または翌年の1月に繰り越したいのですが、何か良い方法があるでしょうか?
ご教授いただけると幸いです。

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

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

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

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

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

KojiDoi

2021/07/08 10:45

問題の状況が理解できません。使用日が2020-01-01なのに使用月が2020-02ってどういうこと?
Y_amemiya

2021/07/08 10:55

ご質問ありがとうございます。 紛らわしくなってしまいました。申し訳ないです。 使用月がわかればよいので、使用日は特に変更しなくても大丈夫です。 ですので、新たに追加された行のなかで、使用日はNAでも構いません。
KojiDoi

2021/07/08 12:18

> 使用月がわかればよいので、使用日は特に変更しなくても大丈夫です。 その「使用月」の手がかりになるデータが何一つ見当たらない。31と9という数字をどうやって出しているのですか? これで良い方法をと言われても誰も答えられないでしょう。
Y_amemiya

2021/07/08 13:07

使用月は使用日の年月をそのままもってきています。 また、「31」は2020-01-01から2020-01-31までの経過日数です。 「9」は使用期間40から1月分の使用期間31を引いて算出しています。
KojiDoi

2021/07/08 17:54

やっと少しわかってきた。「使用日」っていうのは正しくは「使用開始日」だってことですね。 Date型オブジェクトを使えば楽に対処できるんじゃないかと思います。気力が続くようなら後で考えてみましょう。
guest

回答2

0

注目すべき期間の最後の日とその間の日々の月のデータをDate型を活用して割り出し、which()、length()、sapply()を組み合わせて月ごとの日数に変換します。

> startdate <- "2020-01-01" > day <- 40 > d1 <- as.Date(date1, "%Y-%m-%d") > d2 <- d1+day-1 > d2 [1] "2020-02-09" > m <- as.integer(sapply(d1:d2, function(x){format(as.Date.numeric(x, "1970-01-01"), "%m")})) > m [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 > sapply(min(m):max(m), function(x){length(which(m==x))}) [1] 31 9

考え方としては以上でどうでしょう。
解析相手をデータフレームにしてスクリプト化する部分は考えてみてください。

投稿2021/07/08 18:13

KojiDoi

総合スコア13671

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

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

Y_amemiya

2021/07/09 04:00

ご返信、誠にありがとうございます! sapplyでカラムを指定する方法はないでしょうか?
KojiDoi

2021/07/09 08:48

質問の意図を理解できてるか自信ないけど、示したコードのstartdateとかdayとかの定義部分を「カラム」を指し示すものに差し替えればいいんじゃないですか?
guest

0

X月のデータを全て取り出して、それぞれのレコードの使用日数で合計を出せばいいのではないでしょうか。

投稿2021/07/08 13:33

yaha4967

総合スコア106

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問