4

さまざまな国での武力紛争について、1989 年から 2008 年までの年を含む R data.frame にパネル データがあります。ただし、特定の年に武力紛争を経験した国の観測のみが含まれています。

データセットは次のようになります。

df <- data.frame(c("1989","1993","1998",
     "1990","1995","1997"),
    c(rep(c(750, 135), c(3,3))), c(rep(1,6)))
names(df)<-c("year","countrycode","conflict")
print(df)

  year countrycode conflict
1 1989         750        1
2 1993         750        1
3 1998         750        1
4 1990         135        1
5 1995         135        1
6 1997         135        1

現在、パネル データのギャップを埋めたいと考えていますが、3 年以内のギャップのみを埋めたいと考えています。たとえば、行 1 と 2 の間と行 5 と 7 の間に行を追加したい (ギャップはそれぞれ 3 年と 1 年です) が、行 2 と 3 の間も行 4 と 5 の間にも追加しません (ギャップはそれぞれ 4 年です)。 . この手順の後、上記の data.frame は次のようになります。

> df2 <- data.frame(c("1989","1990","1991","1992","1993","1998",
+      "1990","1995","1996","1997"),
+     c(rep(c(750, 135), c(6,4))), c(1,0,0,0,1,1,1,1,0,1))
> names(df2) <- c("year","countrycode","conflict")
> print(df2)
   year countrycode conflict
1  1989         750        1
2  1990         750        0
3  1991         750        0
4  1992         750        0
5  1993         750        1
6  1998         750        1
7  1990         135        1
8  1995         135        1
9  1996         135        0
10 1997         135        1

plmパッケージを調べましたが(こちらを参照)、答えが見つかりませんでした。また、私はRに比較的慣れていないので、ヒントをいただければ幸いです。

4

2 に答える 2

3

を使用した解決策を次に示しdata.tableます。アイデアは、最初data.tableに不足しているエントリだけで を作成し(dt.rest)、次にrbindそれらを作成することです。各行の出力 (コピー/貼り付けと印刷による) がわかりやすいように記述しました。何か不明な点があればお知らせください。

require(data.table)
dt <- data.table(df, key="countrycode")
dt$year <- as.numeric(as.character(dt$year))
dt[J(unique(countrycode)), year2 := c(tail(year, -1), NA)]
dt.rest <- dt[, { tt <- which(year2-year-1 <=3); 
                  list(year = unlist(lapply(tt, function(x) 
                              seq(year[x]+1, year2[x]-1, by=1))), 
                       conflict = 0)
                }, by=countrycode]
setcolorder(dt.rest, c("year", "countrycode", "conflict"))

#    year countrycode conflict
# 1: 1996         135        0
# 2: 1990         750        0
# 3: 1991         750        0
# 4: 1992         750        0

今、私たちはrbindそれらをしなければなりません。これは、そのバインドrbindlist内の関数を使用するか、よりもはるかに効率的に実行されます。data.tabledata.framedata.tablerbind

dt[, year2 := NULL]
dt <- rbindlist(list(dt, dt.rest))
setkey(dt, "countrycode", "year")

dt
#     year countrycode conflict
#  1: 1990         135        1
#  2: 1995         135        1
#  3: 1996         135        0
#  4: 1997         135        1
#  5: 1989         750        1
#  6: 1990         750        0
#  7: 1991         750        0
#  8: 1992         750        0
#  9: 1993         750        1
# 10: 1998         750        1
于 2013-03-30T12:31:57.977 に答える
2

この解決策は、初心者にとっては厄介で理解しにくいように見えるかもしれませんが、(少なくとも私にとっては) 非常に具体的で珍しい問題であるため、これ以上基本的なことは思いつきません。

# Convert the `year` column to integer in case it is a factor
df$year <- as.integer(as.character(df$year))

df.country <- lapply(
    # Split `df` by `countrycode` to make one data frame per country
    split(df, df$countrycode),

    # Apply the following function to each coutry's data frame
    function(tab){
        # Send the start and end years of each gap to the following function
        imputed.yr <- mapply(function(start, end)
            # If the gap is small enough add all values in between
            # otherwise just return the start and end years
            if(end - start < 5) start:end else c(start, end),
        tab$year[-nrow(tab)], tab$year[-1])

        # Remove duplicate years
        imputed.yr <- unique(unlist(imputed.yr))
        # Pack up and return a new data frame
        data.frame(year = imputed.yr,
                   contrycode = tab$countrycode[1],
                   conflict = imputed.yr %in% tab$year)
    })

# Paste all the imputed country specific data frames together
do.call(rbind, df.country)

上記のコードは、次の出力を生成します。これは、要求したものと本質的に同じです。

      year contrycode conflict
135.1 1990        135     TRUE
135.2 1995        135     TRUE
135.3 1996        135    FALSE
135.4 1997        135     TRUE
750.1 1989        750     TRUE
750.2 1990        750    FALSE
750.3 1991        750    FALSE
750.4 1992        750    FALSE
750.5 1993        750     TRUE
750.6 1998        750     TRUE
于 2013-03-30T12:15:57.863 に答える