根据行子集的逻辑条件对数据框进行子集化

Subsetting a data frame based on a logical condition on a subset of rows

我试图想出一个简单的解决方案来解决以下问题。这是最小的工作示例:

data <- data.frame(subject = c('Math', 'English', 'French', 'English'),
                   grade = c(1, 3, 5, 4))

我想要一个比较英语成绩的函数和 returns 一个逻辑向量,该向量对英语成绩最高的行具有 TRUE,对所有其他行具有 FALSE。在这种情况下 [1] FALSE FALSE FALSE TRUE.

我们可以得到 max 'grade' 每个 'subject' 和 ave 将其与 'grade' 进行比较以获得逻辑索引并检查 'subject' 也是 'English'

with(data, ave(grade, subject, FUN = max)==grade & subject == "English") 
#[1] FALSE FALSE FALSE  TRUE

使用 ifelse 条件,一种方法如下。

library(dplyr)

data %>%
mutate(check = if_else(subject == "English" & grade == max(grade[subject == "English"]),
       TRUE,
       FALSE))

#  subject grade check
#1    Math     1 FALSE
#2 English     3 FALSE
#3  French     5 FALSE
#4 English     4  TRUE

使用 ifelse() 命令的解决方案的另一种变体:

data <- data.frame(subject = c('Math', 'English', 'French', 'English'),
                   grade = c(1, 3, 5, 4))

output <-ifelse(data[,1] == "English" & data[,2] == 4, TRUE, FALSE)

> output
[1] FALSE FALSE FALSE  TRUE