1

私は1つのことに苦労しています。個人ID、各個人の入場年と退場年を含むRデータフレームがあります。次のようになります。

id  Entry  Exit  
1   1988  1990  
2   1986  1987

間隔(入口、出口)が含まれる年に拡張される新しいデータフレームが必要です。つまり、これが必要です。

id Year  
1  1988  
1  1989  
1  1990  
2  1986  
2  1987

私は正しいループを作成することができませんでした、そして私はあなたの助けに非常に感謝するでしょう。
乾杯

4

2 に答える 2

2
d <- structure(list(id = c(1, 2), Entry = c(1988, 1986), Exit = c(1990, 
                1987)), .Names = c("id", "Entry", "Exit"), row.names = c(NA, 
                                                                                                                      -2L), class = "data.frame")

years <- apply(d, 1, function(x) seq(x[2], x[3]))
ids <- rep(d[, "id"], lapply(years, length))

res <- cbind(ids, unlist(years))
res

# ids     
#[1,]   1 1988
#[2,]   1 1989
#[3,]   1 1990
#[4,]   2 1986
#[5,]   2 1987
于 2012-09-12T14:36:41.047 に答える
1

ここで2つのオプション:

  1. apply-styleコマンドでdata.frameを構築し、その後、小さなdfを大きなdfにスタックします。
  2. または、apply-styleコマンドを使用して年の拡張を処理し、その後IDを繰り返す必要がある回数を計算します。これは、@LucianoSelzerが彼のエレガントな応答で行うことです。

どちらの方法でも問題なく動作します。前者の例を次に示します。

dat <- data.frame(id=seq(2),entry=c(88,86),exit=c(90,87))
res <- apply(dat,1,function(x) data.frame(id=x[1],year=seq(x[2],x[3])) )
> res
[[1]]
  id year
1  1   88
2  1   89
3  1   90

[[2]]
  id year
1  2   86
2  2   87

resdata.framesのリストになりました。次に、data.framesを組み合わせることができます。

library(taRifx)
> stack(res)
  id year
1  1   88
2  1   89
3  1   90
4  2   86
5  2   87

またはベースR:

do.call(rbind、res)id year 1 1 88 2 1 89 3 1 90 4 2 86 5 2 87

于 2012-09-12T14:31:34.833 に答える