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

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

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

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

Q&A

解決済

2回答

880閲覧

R 時系列データ t-1期の変数の値を、t期のデータに変数として追加したい

Mayu___

総合スコア4

R

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

0グッド

0クリップ

投稿2021/11/05 00:01

編集2021/11/05 06:23

使用したいデータ(df)は以下のような時系列データです。
name year price_t
A社 1999 200
A社 2000 199
A社 2001 201
A社 2002 205
B社 1999 202
B社 2000 203
B社 2001 201

以上のデータの"price_t"という列のデータから、1年前の値が入った"price_t-1"という変数を作成したいです。
目標は以下の通りです。

name year price_t price_t-1
A社 1999 200
A社 2000 199   200
A社 2001 201 199
A社 2002 205 201
B社 1999 202
B社 2000 203 202
B社 2001 201 203

tapply関数(tapply(df$price,df$name,関数))が利用できるという情報を得ましたが、年をどのように指定したらよいかわからない状況です。

教えていただけると幸いです。

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

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

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

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

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

KojiDoi

2021/11/05 05:08

説明と例題データで列名が一致していません。紛らわしいので正しく統一してください。
Mayu___

2021/11/05 06:22

大変失礼致しました。
guest

回答2

0

ベストアンサー

transform() 関数を使ってみました。カラム名ですが、- が使えない(演算子の - だと解釈される)ので、price_t_1 としています。また、前年度のデータが無い場合は NA としています。

r

1df <- data.frame( 2 "name" = c(rep("A社", 4), rep("B社", 3)), 3 "year" = c(1999:2002, 1999:2001), 4 "price_t" = c(200, 199, 201, 205, 202, 203, 201) 5) 6 7dfx <- transform(df, price_t_1 = 8 price_t[match(paste(name, year-1), paste(name, year), nomatch = NA)]) 9 10print(dfx) 11# 12 name year price_t price_t_1 131 A社 1999 200 NA 142 A社 2000 199 200 153 A社 2001 201 199 164 A社 2002 205 201 175 B社 1999 202 NA 186 B社 2000 203 202 197 B社 2001 201 203

※ 前回と同様に、dplyr などを利用すれば、もっと判りやすい書き方ができるかと思います。

投稿2021/11/05 13:47

編集2021/11/05 14:07
melian

総合スコア19865

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

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

Mayu___

2021/11/05 20:20

前回に引き続き、ご回答いただきありがとうございました! 大変助かりました
guest

0

tapplyでは行を跨いだ処理は多分難しいですね。

こう云うときは中間データを書き込む「作業用の列」を適宜追加しながら作業を進めていくのが分かりやすくていい思います。具体的には、まずは会社名ごとのIDを振った列をもう一つ作り、それを手がかりに「一つ前」のデータを特定してprice_t-1列に書き込んでいくという手順をふめばできそうです。

Rで同じIDごとに連番をふる方法(再) - Qiita

dplyrあたりを使ったスマートなコードがあり得るかもしれませんが、まずはforループで地道に作ってみるといいかと思います。

投稿2021/11/05 09:07

KojiDoi

総合スコア13671

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

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

Mayu___

2021/11/05 20:21

ご回答いただきありがとうございます! 他のケースで応用する際にも参考にさせていただきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問