如何根据另一列的值编辑值

How to edit values based on another column's value

我想有选择地编辑前缀为 grade 的列。我只想保留 days 等于 "0 days""1 days" 的这些列的值。我想将其余值分配为 NA.

我尝试过使用 mutateifelse,但无法正确组合。

data <- data.frame(
"grade_a" = c(1,3,4,2,3), 
"grade_b" = c(8,6,5,7,8), 
"name_c" = c("Sarah", "Joe", "Dave", "Annie", "Thomas"), 
"days" = c("0 days", "4 days", "5 days", "1 days", "0 days"))

This is the output I am looking for:

results <- data.frame(
"grade_a" = c(1,NA,NA,2,3), 
"grade_b" = c(8,NA,NA,7,8), 
"name_c" = c("Sarah", "Joe", "Dave", "Annie", "Thomas"), 
"days" = c("0 days", "4 days", "5 days", "1 days", "0 days"))

我们可以使用across:

library(tidyverse)

data %>%
    mutate(across(starts_with("grade"),
                  ~ifelse(days %in% c("0 days", "1 days"), ., NA)))

#   grade_a grade_b name_c   days
# 1       1       8  Sarah 0 days
# 2      NA      NA    Joe 4 days
# 3      NA      NA   Dave 5 days
# 4       2       7  Annie 1 days
# 5       3       8 Thomas 0 days

您也可以像您提到的那样使用case_when

data %>%
  rowwise() %>%
  mutate(across(grade_a:grade_b, ~ case_when(
    days %in% c("0 days", "1 days") ~ .x,
    TRUE ~ as.double(NA)
  )))

# A tibble: 5 x 4
# Rowwise: 
  grade_a grade_b name_c days  
    <dbl>   <dbl> <chr>  <chr> 
1       1       8 Sarah  0 days
2      NA      NA Joe    4 days
3      NA      NA Dave   5 days
4       2       7 Annie  1 days
5       3       8 Thomas 0 days

您可以像这样使用 across 函数:

library(dplyr)
data %>% mutate(across(.cols = starts_with("grade"),.fns = ~if_else(days %in%c("0 days","1 days"),.,NA_real_)))