だから私は次の形式のデータセットを持っています:
ID Var1 Var2
1 2 0
1 8 0
1 12 0
1 11 1
1 10 1
2 5 0
2 8 0
2 7 0
2 6 1
2 5 1
データフレームをサブセット化し、Var1が最初にグループに達した後の行のみを含む新しいデータフレームを作成したいと思います-最大(これが発生する行を含む)からVar2が初めて1になる行(この行も含む)まで。だから私が欲しいものは次のようになります:
ID Var1 Var2
1 12 0
1 11 1
2 8 0
2 7 0
2 6 1
元のデータセットには多数のNAが含まれており、関数はそれらを単に無視する必要があります。また、Var2がグループの「1」に到達しない場合は、すべての行を新しいデータフレームに追加する必要があります(もちろん、Var1がグループの最大値に達した後の行のみ)。しかし、プログラミングに手を包むことはできません。誰か助けを知っていますか?
ベースのdplyr
ソリューションは、質問が求めることを実行します。cumsum
filter
library(dplyr)
df1 %>%
group_by(ID) %>%
filter(cumsum(Var1 == max(Var1)) == 1, cumsum(Var2) <= 1)
## A tibble: 5 x 3
## Groups: ID [2]
# ID Var1 Var2
# <int> <int> <int>
#1 1 12 0
#2 1 11 1
#3 2 8 0
#4 2 7 0
#5 2 6 1
編集
これは、OPのコメントと質問の編集に答えようとする解決策です。
df1 %>%
group_by(ID) %>%
mutate_at(vars(starts_with('Var')), ~replace_na(., 0L)) %>%
filter(cumsum(Var1 == max(Var1)) == 1, cumsum(Var2) <= 1)
データ
df1 <- read.table(text = "
ID Var1 Var2
1 2 0
1 8 0
1 12 0
1 11 1
1 10 1
2 5 0
2 8 0
2 7 0
2 6 1
2 5 1
", header = TRUE)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加