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

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

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

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

Q&A

解決済

2回答

731閲覧

R 時系列データの、ある1時点の値が入った変数から過去3年の合計値が入った変数を作りたいです

Mayu___

総合スコア4

R

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

0グッド

0クリップ

投稿2021/11/03 23:18

前提・実現したいこと

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

以上のデータのstockpriceという列のデータから、過去3年の合計値が入ったtotal_stockpriceという変数を作成したいです。
例えばA社2001年の場合、total_stockprice=200+199+201=600、
A社2002年の場合、total_stockprice=199+201+205=605となります

どのような関数を使えばよいか調べてもわからなかったため、教えていただけると嬉しいです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

データフレームに対して、特定の項目に書かれた種別ごとに何らかの処理をしたい場合、tapply関数が使えます。
yearを1999以上2001以下に限定したうえで、会社ごとにpriceの合計を得たいとすると、ざっとこんな感じです。

df <- data.frame( "name" = c(rep("A社", 4), rep("B社", 4)), "year" = rep(1999:2002, 2), "stockprice" = c(200, 199, 201, 205, 300, 299, 301, 305) ) df$name.f <- as.factor(df$name) df1 <- subset(df, 1999<=year & year<=2001) tapply(df1$stockprice, df1$name.f, sum)

実際には上記のコードに基づいてもう少し汎用性を持たせたユーザー関数を仕立てるのがいいでしょう。

投稿2021/11/04 04:56

編集2021/11/04 05:57
KojiDoi

総合スコア13692

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

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

Mayu___

2021/11/04 22:11

ご回答いただきありがとうございます!参考にさせていただきます
guest

0

ベストアンサー

R のデフォルト関数のみを使ってみました(dplyr パッケージなどを利用すれば、もっと判りやすい書き方ができるかと思います)。

r

1df <- data.frame( 2 "name" = c(rep("A社", 4), rep("B社", 4)), 3 "year" = rep(1999:2002, 2), 4 "stockprice" = c(200, 199, 201, 205, 300, 299, 301, 305) 5) 6 7do.call(rbind, c( 8 lapply(split(df, df$name), 9 function(x) { 10 data.frame(x, 11 total_stockprice = { 12 i = findInterval(x$year-3, x$year) 13 w = which(as.logical(i)) 14 cs = cumsum(x$stockprice) 15 i[w] = cs[i[w]] 16 cs - i 17 })}), make.row.names=F)) 18 19df 20 21# 22df 23 name year stockprice total_stockprice 241 A社 1999 200 200 252 A社 2000 199 399 263 A社 2001 201 600 274 A社 2002 205 605 285 B社 1999 300 300 296 B社 2000 299 599 307 B社 2001 301 900 318 B社 2002 305 905

投稿2021/11/04 03:33

melian

総合スコア20655

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

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

Mayu___

2021/11/04 22:27

ご回答いただきありがとうございます! 実際のデータ(2002年以降含む)で応用できそうなので、真似させていただいてます。 追加で質問させていただきたいのですが、 スクリプト1行目でdf <- data.frame(...と、dfの中身を定義していますが、既存のデータを使う場合、9行目data.frame(x,...の「data.frame」の部分はどのようにしたらよいでしょうか? 試しに実際の時系列データ名"sorted_ALLYEAR"を該当箇所に入れてみたのですが、「sorted_ALLYEAR(x, total_stockprice = { でエラー:    関数 "sorted_ALLYEAR" を見つけることができませんでした 」というエラーメッセージが表示されている状態です。 上手く説明できていない部分があったら申し訳ございません。ご回答いただけると大変助かります。よろしくお願いいたします。
melian

2021/11/05 00:12

sorted_ALLYEAR を入れるのそこではなく、lapply の箇所です。 do.call(rbind, c( lapply(split(sorted_ALLYEAR, sorted_ALLYEAR$name), function(x) { ... function(x) { ... 以降は変更しません。
Mayu___

2021/11/05 06:15

ご返信ありがとうございます! お陰様で上手くいきました^ ^ 大変助かりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問