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

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

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

RStudioは、Rのプログラミングを効率化する統合開発環境です。統計計算とグラフィックスができるプログラミング言語であるRのIDEでOSSで公開されています。ソースコードやコンソールなどが一つの画面に見やすく配置されている点が特徴。コマンド名以外に、関数名やパッケージ名も補完できます。

R

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

データ構造

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

Q&A

解決済

2回答

1228閲覧

【R】パネルデータにおけるイベント発生までの年数変数の作り方

discipulus

総合スコア1

RStudio

RStudioは、Rのプログラミングを効率化する統合開発環境です。統計計算とグラフィックスができるプログラミング言語であるRのIDEでOSSで公開されています。ソースコードやコンソールなどが一つの画面に見やすく配置されている点が特徴。コマンド名以外に、関数名やパッケージ名も補完できます。

R

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

データ構造

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

0グッド

0クリップ

投稿2021/04/30 06:35

前提・実現したいこと

現在R(RStudio)でパネルデータを構築しています。
イベントが発生するまでの年数を表す変数を作りたいです。

発生している問題・エラーメッセージ

仮に日本とアメリカ2カ国を2001年からカバーしているデータだとします。
日本ではイベントが2003年と2008年に、アメリカでは2001年・2006年・2009年にそれぞれ発生しているとします。
データフレームは以下の通りです。

countryyearevent
Japan20010
Japan20020
Japan20031
Japan20040
Japan20050
Japan20060
Japan20070
Japan20081
Japan20090
Japan20100
United States20011
United States20020
United States20030
United States20040
United States20050
United States20061
United States20070
United States20080
United States20091
JUnited States20100

このデータに、イベント発生までの年数を表す変数を以下のような形で追加したいです。
※最後にイベントが発生した後(日本なら2009年、アメリカなら2009年)にいつイベントが発生しているかはデータセット上特定できないので、NAとしておきたいです。

countryyeareventtime1
Japan200102
Japan200201
Japan200310
Japan200404
Japan200503
Japan200602
Japan200701
Japan200810
Japan20090NA
Japan20100NA
United States200110
United States200204
United States200303
United States200402
United States200501
United States200610
United States200702
United States200801
United States200910
JUnited States20100NA

また、イベントが発生してからの年数を表す変数も合わせて加えたいです。
※同様の理由でNAが入ります。

countryyeareventtime1time2
Japan200102NA
Japan200201NA
Japan2003100
Japan2004041
Japan2005032
Japan2006023
Japan2007014
Japan2008100
Japan20090NA1
Japan20100NA2
United States2001100
United States2002041
United States2003032
United States2004023
United States2005014
United States2006100
United States2007021
United States2008012
United States2009100
JUnited States20100NA1

該当のソースコード

最初のデータフレームを作れるようにコードを置いておきます。

R

1country <- c("Japan","Japan", "Japan", "Japan", "Japan", 2 "Japan", "Japan", "Japan", "Japan", "Japan", 3 "United States", "United States", "United States", "United States", "United States", 4 "United States", "United States", "United States", "United States", "United States") 5year <- c(2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 6 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010) 7event <- c(0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 8 1, 0, 0, 0, 0, 1, 0, 0, 1, 0) 9data <- data.frame( 10country = country, 11year = year, 12event = event 13)

試したこと

当該データフレームをpdata.frame化してlag関数を使ってなんとかできないかと考えましたが、思いつきませんでした。

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

R 4.0.3
R Studio Version 1.2.5033

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

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

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

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

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

guest

回答2

0

ベストアンサー

ループ内の条件判定が多少シンプルになることを期待して、
国別にサブセットを作って処理してから最後にrbindしてsortして仕上げるという作戦を考えてみました。

R

1data2 <- data.frame() 2 3data$orig.nr <- 1:nrow(data) 4for(key_country in unique(data$country)){ 5 # 国別にサブセットを作って処理 6 subdata <- subset(data, country==key_country) 7 8 subdata[nrow(subdata), "time1"] <- ifelse(subdata[nrow(subdata),"event"]==1, 0, NA) 9 for(i in (nrow(subdata)-1):1){ 10 subdata[i, "time1"] <- ifelse( 11 subdata[i, "event"]==1, 0, subdata[i+1, "time1"]+1 12 ) 13 } 14 15 subdata[1, "time2"] <- ifelse(subdata[1, "event"]==1, 0, NA) 16 for(i in 2:nrow(subdata)){ 17 subdata[i, "time2"] <- ifelse( 18 subdata[i, "event"]==1, 0, subdata[i-1, "time2"]+1 19 ) 20 } 21 22 data2 <- rbind(data2, subdata) 23} 24 25data2 <- data2[order(data2$orig.nr),] # オリジナルのdataの順番を復元 26data2$orig.nr <- NULL 27print(data2)

投稿2021/05/01 00:45

KojiDoi

総合スコア13692

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

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

discipulus

2021/05/02 01:44

ご回答ありがとうございます。例示スクリプト及び元のデータでうまくいきました。 重ねて、感謝申し上げます。
guest

0

例示の最後の行が JUnited States
でDataFrameの例示スクリプトだと United States
ですが例示スクリプトでDataFrameを作成し
ちょっと泥臭いですが下記で実現できると思います。

R

1# time1 2pre_country = 'dummy' 3for (i in nrow(data):1) { 4 if (pre_country != data$country[i]) { 5 time1_cnt = NA 6 } 7 pre_country = data$country[i] 8 if (data$event[i] == 1) { 9 time1_cnt = 0 10 } else { 11 time1_cnt = time1_cnt + 1 12 } 13 data$time1[i] = time1_cnt 14} 15 16# time2 17pre_country = 'dummy' 18for (i in 1:nrow(data)) { 19 if (pre_country != data$country[i]) { 20 time2_cnt = NA 21 } 22 pre_country = data$country[i] 23 if (data$event[i] == 1) { 24 time2_cnt = 0 25 } else { 26 time2_cnt = time2_cnt + 1 27 } 28 data$time2[i] = time2_cnt 29} 30data

投稿2021/04/30 14:33

aokikenichi

総合スコア2240

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

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

discipulus

2021/04/30 23:32

迅速かつご丁寧にありがとうございます。 例示スクリプトではうまくいきました。(例示の表でJUnited Statesになっているのはただのコピペミスです) ただ、実際のデータでやってみると、event変数で欠損があるため、うまくいきませんでした。 (エラーメッセージ「TRUE/FALSE が必要なところが欠損値です」と出ました) この場合の対処法も合わせてお教えいただけますと幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問