Как заменить значение на NA на основе двух условий в r dplyr?

#r #dataframe #dplyr

#r #фрейм данных #dplyr

Вопрос:

Мне нужно заменить числовое значение на NA на основе условий в двух других столбцах.

Это мой воспроизводимый пример:

 library(dplyr)

data1 <- read.csv(text = "
  site,day,biomass,aereal,root,ei.obs
  siteA,50,464.65,2020.3,307.3,0.84
  siteA,NA,NA,NA,NA,NA
  siteA,NA,NA,NA,NA,NA
  siteA,59,1222.565,2159.5,148.3,0.93
  siteA,NA,NA,NA,NA,NA
  siteA,NA,NA,NA,NA,NA
  siteA,66,1250.86,2046.8,159.1,0.92
  siteB,50,464.65,2020.3,307.3,0.84
  siteB,NA,NA,NA,NA,NA
  siteB,NA,NA,NA,NA,NA
  siteB,59,1222.565,2159.5,148.3,0.93
  siteB,NA,NA,NA,NA,NA
  siteB,NA,NA,NA,NA,NA
  siteB,66,1250.86,2046.8,159.1,0.92")


data1.1 <- data1 %>% 
  mutate(ei.obs =  if_else(site == "siteA" amp; day == 66, NA , ei.obs)) 
 

И это ошибка, которую я получил:

 Error: Problem with `mutate()` input `ei.obs`.
x `false` must be a logical vector, not a double vector.
i Input `ei.obs` is `if_else(site == "siteA" amp; day == 66, NA, ei.obs)`.
 

В качестве альтернативы, я попробовал это:

 data1.1 <- data1 %>% 
  mutate(ei.obs =  na_if(ei.obs, site == "siteA" amp; day == 66)) 
 

Но в фрейме данных ничего не меняется.

Ожидаемый результат таков:

введите описание изображения здесь

Ответ №1:

Простое решение — использовать ifelse вместо if_else :

 library(dplyr)
data1.1 <- data1 %>% mutate(ei.obs =  ifelse(site == "siteA" amp; day == 66, NA , ei.obs))
 

if_else требуется оба вывода одного и того же типа. NA имеет класс logical, поэтому вы получаете ошибку, которую вы можете использовать NA_real вместо этого.

 library(dplyr)
data1.1 <- data1 %>% mutate(ei.obs =  if_else(site == "siteA" amp; day == 66, NA_real_, ei.obs))
 

Кстати, копирование ваших данных создает пробелы в site столбце, вы можете удалить их с помощью trimws .

 data1$site <- trimws(data1$site)