【发布时间】:2022-01-06 09:35:42
【问题描述】:
我想创建一个新列,仅在它匹配特定条件时记录它(此处为 x > 2),然后直接为这些行覆盖另一个现有列(此处为 auxiliary)其中条件 (x > 2) 返回 TRUE。
df <- tibble(x = 1:5, y = 1:5, auxiliary = NA)
# A tibble: 5 x 3
x y auxiliary
<int> <dbl> <lgl>
1 1 NA
2 2 NA
3 3 NA
4 4 NA
5 5 NA
我可以在mutate() 内的两个不同调用中成功地做到这一点:
df %>%
mutate(result = if_else(condition = x > 2,
true = x+y,
false = NA_real_),
auxiliary = if_else(condition = x > 2,
true = "Calculation done",
false = NA_character_))
# A tibble: 5 x 4
x y auxiliary result
<int> <dbl> <chr> <dbl>
1 1 NA NA
2 2 NA NA
3 3 Calculation done 6
4 4 Calculation done 8
5 5 Calculation done 10
但是有一些代码重复 (condition = x > 2),在更复杂的情况下,这使得阅读代码非常不安并且容易出错,尤其是当有多个条件时。
有没有办法通过不重复条件来简化上面的代码? :
- 创建新变量 (
mutate()) - 仅在条件匹配时记录(
if_else或case_when()) - 仅当行的条件匹配时才写入另一列的值。 (我被困在这里)
看起来像这样的东西:
df %>%
mutate(result = case_when(
x > 2 ~ x + y & auxiliary == "Calculation done", # we'd add the column reference here...
TRUE ~ NA_real & auxiliary = NA_character_))
非常感谢! tidyverse 中的任何解决方案都是理想的。
【问题讨论】:
标签: r dplyr conditional-statements