如何只保留满足 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]为考试模态(condition),成绩为x1和x2。
我想根据以下条件只保留一行:
C > B > A
我想先离开C行;如果不是,留下 B 行;如果 C 和 B 不存在,则保留 A 行。
期望的输出:
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
在 base R 中,这可以写成:
df1 <- df[order(match(df$c1, req_order)), ]
df1[!duplicated(df1$ID), ]
我有一个数据框,其中包含大约 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]为考试模态(condition),成绩为x1和x2。
我想根据以下条件只保留一行:
C > B > A
我想先离开C行;如果不是,留下 B 行;如果 C 和 B 不存在,则保留 A 行。
期望的输出:
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
在 base R 中,这可以写成:
df1 <- df[order(match(df$c1, req_order)), ]
df1[!duplicated(df1$ID), ]