如何根据另一列的值编辑值
How to edit values based on another column's value
我想有选择地编辑前缀为 grade
的列。我只想保留 days
等于 "0 days"
或 "1 days"
的这些列的值。我想将其余值分配为 NA
.
我尝试过使用 mutate
和 ifelse
,但无法正确组合。
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_)))
我想有选择地编辑前缀为 grade
的列。我只想保留 days
等于 "0 days"
或 "1 days"
的这些列的值。我想将其余值分配为 NA
.
我尝试过使用 mutate
和 ifelse
,但无法正确组合。
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_)))