第3章 変数の作成

ここではTriangulating Peaceのレプリケーションデータを使用します。

library(tidyverse)
tri <- read_csv("data/triangle.csv")
## Parsed with column specification:
## cols(
##   statea = col_double(),
##   stateb = col_double(),
##   year = col_double(),
##   dependa = col_double(),
##   dependb = col_double(),
##   demauta = col_double(),
##   demautb = col_double(),
##   allies = col_double(),
##   dispute1 = col_double(),
##   logdstab = col_double(),
##   lcaprat2 = col_double(),
##   smigoabi = col_double(),
##   opena = col_double(),
##   openb = col_double(),
##   minrpwrs = col_double(),
##   noncontg = col_double(),
##   smldmat = col_double(),
##   smldep = col_double(),
##   dyadid = col_double()
## )

3.1 四則演算

基本的にオブジェクトに$をつけて新しい変数名をつけて代入することで新しい変数を作成します。 例えば、A国とB国の民主主義度であるdemautademautbの平均demautmを作成するには次のようにします。

tri$demautm <- (tri$demauta + tri$demautb)/2
tri %>% 
  select(demauta, demautb, demautm) %>% 
  head()
  • 四則演算は+(足し算)、-(引き算)、*(掛け算)、/(割り算)で行います。
  • 他にも、%%(整数商)や^(累乗)もあります。

tidyverse表記の場合、dplyrmutate()を使います。 この関数は第1引数にデータフレームを取り、その後ろに新しい変数の定義を書きます。

tri <- tri %>% 
  mutate(demautm = (demauta + demautb)/2)
tri %>% 
  select(demauta, demautb, demautm) %>% 
  head()

3.2 条件に基づく変数

ifelse()関数を使うと条件によって値の変わる変数を作成します。 例えば、smldepとはdependadependbの小さい方なので、これをmindepとすると次のように作成します。

tri$mindep <- ifelse(tri$dependa < tri$demautb, tri$dependa, tri$dependb)
tri %>% 
  select(dependa, dependb, smldep, mindep) %>% 
  head()

さて、if_else()は何をしているのでしょうか? まず、第1引数は条件式となっています。 そして、その条件を満たす場合は第2引数を、満たさない場合は第3引数を出力します。 つまり、dependadependbよりも小さければdependaを、大きければdependbを返しています。

tidyverseの場合は、ほとんど同じですが、if_else()という関数を使います。

tri <- tri %>% 
  mutate(if_else(dependa < demautb, dependa, dependb))
tri %>% 
  select(dependa, dependb, smldep, mindep) %>% 
  head()

tidyversecase_when()を使うと条件に応じて作る変数の値を2種類以上にすることができます。 例えば、1919年までをprewar1920年から1945年をinterwar1946年からをcoldwarとするような変数systemを作ります。

tri <- tri %>% 
  mutate(system = case_when(year <= 1919 ~ "prewar",
                            year > 1919 & year <= 1945 ~ "interwar",
                            year > 1945 ~ "coldwar"))

長くなるので、実行しませんが、table()によって、yearsystemの対応関係をクロス表にできます.

table(tri$system, tri$year)
##           
##            1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897
##   coldwar     0    0    0    0    0    0    0    0    0    0    0    0    0
##   interwar    0    0    0    0    0    0    0    0    0    0    0    0    0
##   prewar    104  104  110  110  110  141  118  118  118  118  141  141  141
##           
##            1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910
##   coldwar     0    0    0    0    0    0    0    0    0    0    0    0    0
##   interwar    0    0    0    0    0    0    0    0    0    0    0    0    0
##   prewar    140  150  198  161  161  160  170  156  179  170  179  179  167
##           
##            1911 1912 1913 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929
##   coldwar     0    0    0    0    0    0    0    0    0    0    0    0    0
##   interwar    0    0    0  265  275  235  242  243  401  373  388  457  465
##   prewar    162  171  172    0    0    0    0    0    0    0    0    0    0
##           
##            1930 1931 1932 1933 1934 1935 1936 1937 1938 1946 1947 1948 1949
##   coldwar     0    0    0    0    0    0    0    0    0   15   15   11   11
##   interwar  427  445  454  433  468  478  494  489  479    0    0    0    0
##   prewar      0    0    0    0    0    0    0    0    0    0    0    0    0
##           
##            1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962
##   coldwar   343  336  331  337  338  363  373  393  400  399  540  599  633
##   interwar    0    0    0    0    0    0    0    0    0    0    0    0    0
##   prewar      0    0    0    0    0    0    0    0    0    0    0    0    0
##           
##            1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975
##   coldwar   640  644  703  734  743  748  749  784  819  819  825  796  830
##   interwar    0    0    0    0    0    0    0    0    0    0    0    0    0
##   prewar      0    0    0    0    0    0    0    0    0    0    0    0    0
##           
##            1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988
##   coldwar   850  824  820  800  836  829  850  851  861  849  865  857  855
##   interwar    0    0    0    0    0    0    0    0    0    0    0    0    0
##   prewar      0    0    0    0    0    0    0    0    0    0    0    0    0
##           
##            1989 1990 1991
##   coldwar   802  649  567
##   interwar    0    0    0
##   prewar      0    0    0

ちなみに、mutate()の中では複数の変数を同時に作成することができます。

tri <- tri %>% 
  mutate(demautm = (demauta + demautb)/2,
         if_else(dependa < demautb, dependa, dependb))

3.3 ラグ変数*

パネルデータの場合、ラグ変数(前の時点の変数)を作成することがあります。 tidyversedplyrにあるgroup_by()というグループ化する関数を使うとラグ変数を作成できます。 例えば、smldepのラグ変数をlag_smldepとして作成するとします。

このデータセットでは分析単位はダイアッドなので、cstateastatebでグループ化して変数を作ります。 lag()によって変数のラグを取ることができ、order_byでどの変数に関してラグを取るかを決めることができます。

tri <- tri %>% 
  group_by(statea, stateb) %>% 
  mutate(lag_smldep = lag(smldep, order_by = year))
tri %>% 
  select(statea, stateb, year, smldep, lag_smldep) %>% 
  head()
  • lead()によってリードを取ることもできます。

3.4 日付変数*