根据行子集的逻辑条件对数据框进行子集化
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
我试图想出一个简单的解决方案来解决以下问题。这是最小的工作示例:
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