前提と実現したいこと
パネルデータで変数を作るコードを組んでいます。条件分岐が複雑で、上手くいきません。
前提:データセット
以下のように、4カ国(米日仏独)の2001年から2010年までのデータがあるとします。
※データはあくまで仮のものです。実際のデータは1975年から2015年までの160カ国をカバーしています。
ここで turnover変数は軍の司令官の交代があった年を示すダミー変数、left変数はその年の政府が左派であるかどうかを示すダミー変数です。それぞれ所々欠損があります。
R
1country <- rep(c("United States", "Japan", "France", "Germany"), each = 10) 2year.1 <- 2001:2010 3year <- rep(year.1, 4) 4turnover <- c(0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 5 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 6 NA, NA, 1, 0, 0, 1, 0, 0, 1, 0, 7 0, 0, 1, NA, NA, 0, 1, 0, 0, 1) 8left <- c(0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 9 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 10 1, 1, 0, 0, 0, 0, 0, 0 , 1, 1, 11 NA, NA, NA, 1, 1, 1, 1, 0, 0, 0) 12 13data <- data.frame( 14 country = country, 15 year = year, 16 turnover = turnover, 17 left = left 18)
country | year | turnover | left |
---|---|---|---|
United States | 2001 | 0 | 0 |
United States | 2002 | 0 | 0 |
United States | 2003 | 1 | 0 |
United States | 2004 | 0 | 1 |
United States | 2005 | 0 | 1 |
United States | 2006 | 0 | 1 |
United States | 2007 | 1 | 1 |
United States | 2008 | 0 | 1 |
United States | 2009 | 0 | 0 |
United States | 2010 | 0 | 0 |
Japan | 2001 | 0 | 1 |
Japan | 2002 | 0 | 1 |
Japan | 2003 | 0 | 1 |
Japan | 2004 | 0 | 1 |
Japan | 2005 | 1 | 0 |
Japan | 2006 | 0 | 0 |
Japan | 2007 | 0 | 1 |
Japan | 2008 | 0 | 1 |
Japan | 2009 | 1 | 0 |
Japan | 2010 | 1 | 0 |
France | 2001 | NA | 1 |
France | 2002 | NA | 1 |
France | 2003 | 1 | 0 |
France | 2004 | 0 | 0 |
France | 2005 | 0 | 0 |
France | 2006 | 1 | 0 |
France | 2007 | 0 | 0 |
France | 2008 | 0 | 0 |
France | 2009 | 1 | 1 |
France | 2010 | 0 | 1 |
Germany | 2001 | 0 | NA |
Germany | 2002 | 0 | NA |
Germany | 2003 | 1 | NA |
Germany | 2004 | NA | 1 |
Germany | 2005 | NA | 1 |
Germany | 2006 | 0 | 1 |
Germany | 2007 | 1 | 1 |
Germany | 2008 | 0 | 0 |
Germany | 2009 | 0 | 0 |
Germany | 2010 | 1 | 0 |
実現したいこと
このデータセットで実現したいのは、どのような政府(つまり左派かそうでないか)が軍の司令官を交代させたのかを示す変数です。
例えばUnited Statesでは2003年と2007年に軍の司令官が交代していますが、2003年時にleftは0、2007年時にleftは1です。
したがって、2001年から2003年にかけては非左派に交代させられた司令官が、2004年から2007年には左派に交代させられた司令官がそれぞれ在任しており、そのことを示す変数gov_at_toを以下の要領で作成したいです。
country | year | turnover | left | gov_at_to |
---|---|---|---|---|
United States | 2001 | 0 | 0 | 0 |
United States | 2002 | 0 | 0 | 0 |
United States | 2003 | 1 | 0 | 0 |
United States | 2004 | 0 | 1 | 1 |
United States | 2005 | 0 | 1 | 1 |
United States | 2006 | 0 | 1 | 1 |
United States | 2007 | 1 | 1 | 1 |
しかし、3点complicationがあります。
- United Statesは2007年に司令官の交代があったのを最後に、観察打ち切りの2010年まで交代が発生していないため、このような場合はNAを入れたい。
- フランスでは2003年に交代があったが、2001年と2002年はturnoverが欠損値となっており、交代の有無が確認できないため、このような場合はNAを入れたい。
- ドイツでは2003年に交代があったが、この時のleftは欠損値となっており、どの政府が交代させたか確認できないため、このような場合はNAを入れたい。
以上の条件を全て考慮すると、以下のような変数が最終的に入ります。
country | year | turnover | left | gov_at_to |
---|---|---|---|---|
United States | 2001 | 0 | 0 | 0 |
United States | 2002 | 0 | 0 | 0 |
United States | 2003 | 1 | 0 | 0 |
United States | 2004 | 0 | 1 | 1 |
United States | 2005 | 0 | 1 | 1 |
United States | 2006 | 0 | 1 | 1 |
United States | 2007 | 1 | 1 | 1 |
United States | 2008 | 0 | 1 | NA |
United States | 2009 | 0 | 0 | NA |
United States | 2010 | 0 | 0 | NA |
Japan | 2001 | 0 | 1 | 0 |
Japan | 2002 | 0 | 1 | 0 |
Japan | 2003 | 0 | 1 | 0 |
Japan | 2004 | 0 | 1 | 0 |
Japan | 2005 | 1 | 0 | 0 |
Japan | 2006 | 0 | 0 | 1 |
Japan | 2007 | 0 | 1 | 1 |
Japan | 2008 | 0 | 1 | 1 |
Japan | 2009 | 1 | 0 | 1 |
Japan | 2010 | 1 | 0 | 0 |
France | 2001 | NA | 1 | NA |
France | 2002 | NA | 1 | NA |
France | 2003 | 1 | 0 | 0 |
France | 2004 | 0 | 0 | 0 |
France | 2005 | 0 | 0 | 0 |
France | 2006 | 1 | 0 | 0 |
France | 2007 | 0 | 0 | 1 |
France | 2008 | 0 | 0 | 1 |
France | 2009 | 1 | 1 | 1 |
France | 2010 | 0 | 1 | NA |
Germany | 2001 | 0 | NA | NA |
Germany | 2002 | 0 | NA | NA |
Germany | 2003 | 1 | NA | NA |
Germany | 2004 | NA | 1 | NA |
Germany | 2005 | NA | 1 | NA |
Germany | 2006 | 0 | 1 | 1 |
Germany | 2007 | 1 | 1 | 1 |
Germany | 2008 | 0 | 0 | 0 |
Germany | 2009 | 0 | 0 | 0 |
Germany | 2010 | 1 | 0 | 0 |
試したことと問題
データをpdata.frame()
でパネルデータ化し、以下のようなコードを組んでみました。
R
1data2 <- data.frame() 2 3data$orig.nr <- 1:nrow(data) #オリジナルのデータセットの順番を保存 4 5for(key_country in unique(data$country)){ 6 subdata <- subset(data, country==key_country) # 国別にサブデータセットを作成 7 subdata[nrow(subdata), "gov_at_to"] <- ifelse(subdata[nrow(subdata), "tunover"] == 1, 0, NA) 8 for(i in (nrow(subdata)-1):1){ 9 if (subdata[i, "tunover"] == 0){ 10 subdata[i, "gov_at_to"] <- subdata[i+1, "govt_at_to"] 11 } else if (subdata[i, "tunover"] == 1 & subdata[i, "left"] == 0){ 12 subdata[i, "gov_at_to"] <- 0 13 } else if (subdata[i, "tunover"] == 1 & subdata[i, "left"] == 1){ 14 subdata[i, "gov_at_to"] <- 1 15 } else { 16 subdata[i, "gov_at_to"] <- NA 17 } 18 } 19 data2 <- rbind(data2, subdata) 20} 21 22data2 <- data2[order(data2$orig.nr),] #オリジナルのデータセットの順番に戻す 23data2$orig.nr <- NULL 24print(data2)
しかしながら、for
文の実行で
if (subdata[i, "turnover"] == 0) { でエラー:
TRUE/FALSE が必要なところが欠損値です
というエラーメッセージが出てしまいます。
おそらく条件分岐の設定がうまくいっていないためこのような形になっていると考えられるのですが、解決策を教えていただけましたら幸いです。
# 環境
R version 4.0.3
R Studio Version 1.2.5033
動かしているパッケージはこちら
R
1library(foreign) 2library(tidyverse) 3library(lme4) 4library(dotwhisker) 5library(arm) 6library(mvtnorm) 7library(pastecs) 8library(stargazer) 9library(ggeffects) 10library(lubridate) 11library(ggsci) 12library(plm) 13library(pglm) 14library(gridExtra) 15library(haven) 16library(countrycode) 17library(magrittr) 18library(survival) 19library(bife) 20library(survminer) 21library(lmtest) 22library(multiwayvcov)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。