基于行的子集上的逻辑条件,对数据框进行子集筛选。

3

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

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

我希望有一个函数,能够比较英语成绩并返回一个逻辑向量,在该向量中最高的英语成绩所在行为TRUE,所有其他行为FALSE。在此例子中,[1] FALSE FALSE FALSE TRUE
3个回答

5
我们可以使用ave获取每个科目的最高“grade”,并将其与“grade”进行比较,以获取一个逻辑索引,并检查该科目是否为“英语”。
with(data, ave(grade, subject, FUN = max)==grade & subject == "English") 
#[1] FALSE FALSE FALSE  TRUE

1
这个完美运作!直到现在我才明白ave()的微妙之处。 - RobustTurd

2
使用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

1

使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接