#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)