首页 > 解决方案 > 如果特征存在则变异,否则 NA_real_

问题描述

数据框:

exdf <- data.frame(
  a = 1:3,
  b = c(2,2,2)
)

有时 b 存在,在这种情况下可以这样做:

exdf %>% mutate(c = a / b)

但是,有时特征 b 不会出现,在这种情况下:

exdf %>% select(-b) %>% mutate(c = a / b)
Error: Problem with `mutate()` input `c`.
x object 'b' not found
ℹ Input `c` is `a/b`.

我想告诉dplyr尝试突变,否则如果出现问题,只需将新功能 c 全部NA_real_改为a / b.

这可以做到吗?

标签: rdplyr

解决方案


设置一个简单的 if else 语句,在mutate该语句中检查列名是否在 data.frame 中。

> exdf %>% 
... dplyr::rowwise() %>% 
... dplyr::mutate(q = ifelse("b" %in% colnames(.), a/b, NA_real_))
# A tibble: 3 x 3
# Rowwise: 
      a     b     q
  <int> <dbl> <dbl>
1     1     2   0.5
2     2     2   1  
3     3     2   1.5

> exdf %>%
... dplyr::select(-b) %>%
... dplyr::rowwise() %>% 
... dplyr::mutate(q = ifelse("b" %in% colnames(.), a/b, NA_real_))
# A tibble: 3 x 2
# Rowwise: 
      a     q
  <int> <dbl>
1     1    NA
2     2    NA
3     3    NA

推荐阅读