簡體   English   中英

如何在 R 中僅保留滿足特定條件的行

[英]How to leave only rows that meet a specific condition in R

我有一個數據框,其中包含大約 700 個案例和 1800 次檢查。 有些病例經歷了幾種不同的方式。 我想根據模態的具體情況只留下一個檢查結果。

這是一個虛擬數據框:

df <- data.frame (ID = c("1", "1", "1", "2", "2", "3", "4", "4", "5", "5"),
                  c1 = c("A", "B", "C", "A", "C", "A", "A", "B", "B", "C"),
                  x1 = c(5, 4, 5, 3, 1, 3, 4, 2, 3, 5),
                  x2 = c(4, 3, 7, 9, 1, 2, 4, 7, 5, 0))

有5個案例,10個考試。 [c1]是考試形式(條件),結果是x1和x2。

我想根據以下條件只留下一行:

C > B > A

我想先離開 C 行; 如果沒有,則離開 B 行; 如果 C 和 B 不存在,則保留有 A 的行。

所需的 output:

output <- data.frame (ID = c("1", "2", "3", "4", "5"),
                      c1 = c("C", "C", "A", "B", "C"),
                      x1 = c(5, 1, 3, 2, 5),
                      x2 = c(7, 1, 2, 7, 0))

這是一種方法:

df.srt <- df[order(df$c1, decreasing=TRUE), ]
df.spl <- split(df.srt, df.srt$ID)
first <- lapply(df.spl, head, n=1)
result <- do.call(rbind, first)
result
#   ID c1 x1 x2
# 1  1  C  5  7
# 2  2  C  1  1
# 3  3  A  3  2
# 4  4  B  2  7
# 5  5  C  5  0

您可以根據所需的正確順序arrange數據,對於每個ID select,它位於第一行。

library(dplyr)

req_order <- c('C', 'B', 'A')

df %>%
  arrange(ID, match(c1, req_order)) %>%
  distinct(ID, .keep_all = TRUE)

#  ID    c1       x1    x2
#  <chr> <chr> <dbl> <dbl>
#1 1     C         5     7
#2 2     C         1     1
#3 3     A         3     2
#4 4     B         2     7
#5 5     C         5     0

在基礎 R 中,可以寫成:

df1 <- df[order(match(df$c1, req_order)), ]
df1[!duplicated(df1$ID), ]

暫無
暫無

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

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