第3章 変数の作成
ここではTriangulating Peaceのレプリケーションデータを使用します。
## Rows: 39996 Columns: 19
## ── Column specification ─────────────────────────────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (19): statea, stateb, year, dependa, dependb, demauta, demautb, allies, ...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
3.1 四則演算
基本的にオブジェクトに$
をつけて新しい変数名をつけて代入することで新しい変数を作成します。
例えば、A国とB国の民主主義度であるdemauta
とdemautb
の平均demautm
を作成するには次のようにします。
- 四則演算は
+
(足し算)、-
(引き算)、*
(掛け算)、/
(割り算)で行います。 - 他にも、
%%
(整数商)や^
(累乗)もあります。
tidyverse
表記の場合、dplyr
のmutate()
を使います。
この関数は第1引数にデータフレームを取り、その後ろに新しい変数の定義を書きます。
tri <- tri %>%
mutate(demautm = (demauta + demautb)/2)
tri %>%
select(demauta, demautb, demautm) %>%
head()
3.2 条件に基づく変数
ifelse()
関数を使うと条件によって値の変わる変数を作成します。
例えば、smldep
とはdependa
とdependb
の小さい方なので、これをmindep
とすると次のように作成します。
tri$mindep <- ifelse(tri$dependa < tri$demautb, tri$dependa, tri$dependb)
tri %>%
select(dependa, dependb, smldep, mindep) %>%
head()
さて、if_else()
は何をしているのでしょうか?
まず、第1引数は条件式となっています。
そして、その条件を満たす場合は第2引数を、満たさない場合は第3引数を出力します。
つまり、dependa
がdependb
よりも小さければdependa
を、大きければdependb
を返しています。
tidyverse
の場合は、ほとんど同じですが、if_else()
という関数を使います。
tri <- tri %>%
mutate(if_else(dependa < demautb, dependa, dependb))
tri %>%
select(dependa, dependb, smldep, mindep) %>%
head()
tidyverse
のcase_when()
を使うと条件に応じて作る変数の値を2種類以上にすることができます。
例えば、1919
年までをprewar
、1920
年から1945
年をinterwar
、1946
年からをcoldwar
とするような変数system
を作ります。
tri <- tri %>%
mutate(system = case_when(year <= 1919 ~ "prewar",
year > 1919 & year <= 1945 ~ "interwar",
year > 1945 ~ "coldwar"))
長くなるので、実行しませんが、table()
によって、year
とsystem
の対応関係をクロス表にできます.
##
## 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()
の中では複数の変数を同時に作成することができます。
3.3 ラグ変数*
パネルデータの場合、ラグ変数(前の時点の変数)を作成することがあります。
tidyverse
のdplyr
にあるgroup_by()
というグループ化する関数を使うとラグ変数を作成できます。
例えば、smldep
のラグ変数をlag_smldep
として作成するとします。
このデータセットでは分析単位はダイアッドなので、cstatea
とstateb
でグループ化して変数を作ります。
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()
によってリードを取ることもできます。