簡體   English   中英

R:滿足條件后所有行的子集數據框

[英]R: subset dataframe for all rows after a condition is met

所以我有一個以下形式的數據集:

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 達到其組最大值之后的行)。 但是,我無法繞過編程。 有誰知道幫助嗎?

帶有基於cumsumfilter dplyr解決方案將滿足問題的要求。

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)

data.table.I data.table使用

library(data.table)
setDT(df1)[df1[, .I[cumsum(Var1 == max(Var1)) & cumsum(Var2) <= 1], by="ID"]$V1]
#   ID Var1 Var2
#1:  1   12    0
#2:  1   11    1
#3:  2    8    0
#4:  2    7    0
#5:  2    6    1

數據

df1 <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), 
    Var1 = c(2L, 8L, 12L, 11L, 10L, 5L, 8L, 7L, 6L, 5L), Var2 = c(0L, 
    0L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 1L)), class = "data.frame",
    row.names = c(NA, 
-10L))

這是 Rui Barradas 工作解決方案的data.table翻譯:

library(data.table)

dat <- fread(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)

dat[, .SD[cumsum(Var1 == max(Var1)) & cumsum(Var2) <= 1], by="ID"]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM