Почему ifelse () возвращает целочисленное значение, которое НЕ является истинным или ложным аргументом - PullRequest
0 голосов
/ 13 апреля 2020

У моего df есть два столбца a и b. Строки, которые содержат значения для a, являются NA в b и наоборот. Я sh создаю новый столбец ab, который будет содержать только значения, которые не являются NA

Мои данные:

df = data.frame (a = c(rep("c",4), (rep(NA,4))), b = c(rep(NA,4),rep("e",4)))

Сначала я попытался с помощью dplyr

df = df %>% 
  mutate (ab = ifelse (is.na (a), b, a))

и base

df$ab = ifelse (is.na(df$a), df$b, df$a)

Результат тот же:

     a    b ab
1    c <NA>  1
2    c <NA>  1
3    c <NA>  1
4    c <NA>  1
5 <NA>    e  1
6 <NA>    e  1
7 <NA>    e  1
8 <NA>    e  1

Мои вопросы: 1. Почему он возвращается значение, которого нет ни в одном из истинных или ложных аргументов? 2. Как я могу создать столбец, который объединяет a и b, согласно которому никогда не будет NA? (желательно с использованием dplyr)

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

У вас есть factor столбцы в данных. Ваша проблема будет решена, если вы stringsAsFactors = FALSE при создании фрейма данных.

df <- data.frame (a = c(rep("c",4), (rep(NA,4))), 
                 b = c(rep(NA,4),rep("e",4)), stringsAsFactors = FALSE)

Однако, dplyr имеет замечательную функцию coalesce, которая делает именно то, что вам нужно, без использования ifelse.

library(dplyr)
df %>%  mutate(ab = coalesce(a, b))
0 голосов
/ 13 апреля 2020

Опция с data.table

library(data.table)
setDT(df)[, ab := fcoalesce(a, b)][]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...