6

私はSOを検索しましたが、条件付きで行を削除することについて多くのQAがありますが、どのQAも私の問題に適合しません。

いくつかの被験者において、さまざまな時点でdata.frameの変数などの縦方向の測定値が含まxれています。一部の被験者はイベントを経験します(として示され、そうでない場合は一部で)。イニシャルを次のように減らしたいと思います。ytimeidev10timedata.frame

  • 1)イベントを経験していない(わかりました、それは簡単です)が、含まれている主題のすべての行
  • 2)イベントを経験した被験者の場合、イベントの直前のすべての行(つまり、その個人のイベントの時間よりも少ないすべての行)。

となることによって、

testdf<-data.frame(id=c(rep("A",4),rep("B",4),rep("C",4) ),
                   x=c(NA, NA, 1,2, 3, NA, NA, 1, 2, NA,NA, 5), 
                   y=rev(c(NA, NA, 1,2, 3, NA, NA, 1, 2, NA,NA, 5)),
                   time=c(1,2,3,4,0.1,0.5,10,20,3,2,1,0.5),
                   ev=c(0,0,0,0,0,1,0,0,0,0,0,1))

に減少します

   id  x  y time ev
1   A NA  5  1.0  0
2   A NA NA  2.0  0
3   A  1 NA  3.0  0
4   A  2  2  4.0  0
5   B  3  1  0.1  0
6   C  2  2  3.0  0
7   C NA  1  2.0  0
8   C NA NA  1.0  0
4

4 に答える 4

4

ベースのソリューション:

> do.call(rbind, by(testdf, testdf$id, function(x) x[cumsum(x$ev) == 0,]))
     id  x  y time ev
A.1   A NA  5  1.0  0
A.2   A NA NA  2.0  0
A.3   A  1 NA  3.0  0
A.4   A  2  2  4.0  0
B     B  3  1  0.1  0
C.9   C  2  2  3.0  0
C.10  C NA  1  2.0  0
C.11  C NA NA  1.0  0
于 2013-01-26T15:09:27.663 に答える
4

subsetとを使用した解決策は次のaveとおりです。

subset(testdf, !ave(ev, id, FUN = cumsum))
于 2013-01-26T15:16:34.560 に答える
3

を使用したこのソリューションdata.tableは、で機能するようtestdfです。アイデアはcumsum、最初のイベントの開始後に位置を追跡するために使用することです。

require(data.table)
dt <- data.table(testdf, key=c("id"))
dt.out <- dt[, .SD[cumsum(ev) == 0], by=id]
> dt.out

#    id  x  y time ev
# 1:  A NA  5  1.0  0
# 2:  A NA NA  2.0  0
# 3:  A  1 NA  3.0  0
# 4:  A  2  2  4.0  0
# 5:  B  3  1  0.1  0
# 6:  C  2  2  3.0  0
# 7:  C NA  1  2.0  0
# 8:  C NA NA  1.0  0
于 2013-01-26T15:05:16.730 に答える
3

次に例を示します。

> ddply(testdf, .(id), function(z) z[cumsum(z$ev) == 0, ])
  id  x  y time ev
1  A NA  5  1.0  0
2  A NA NA  2.0  0
3  A  1 NA  3.0  0
4  A  2  2  4.0  0
5  B  3  1  0.1  0
6  C  2  2  3.0  0
7  C NA  1  2.0  0
8  C NA NA  1.0  0
于 2013-01-26T15:07:50.783 に答える