Изменить имя фактора с помощью dplyr - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть переменная во фрейме данных, которая содержит целые числа и некоторые значения «<31». R распознает эту переменную как фактор. </p>

Я хотел бы установить для значений <31 значение 30, но я не смог найти подход для этого. </p>

#example my approach so far
a <- factor(c("31","32","43","36","35","46","<31"))
df <- as.data.frame(a)
str(df)
mutate(df, b = as.numeric(if_else(a == "<31", 30, a)))
Error: `false` must be a double vector, not a `factor` object

Помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Проблема в том, что if_else более строг, чем базовый R ifelse. От help("if_else"):

Описание

По сравнению с базовым ifelse () эта функция более строгая. Он проверяет, что true и false имеют одинаковый тип. Эта строгость делает тип вывода более предсказуемым и делает его несколько быстрее.

И в разделе Аргументы:

true, false
Значения, используемые для TRUE и FALSE значения условия. Они должны быть одинаковой длины с условием или длиной 1. Они также должны быть одного типа: if_else() проверяет, имеют ли они одинаковый тип и класс. Все остальные атрибуты взяты из true.

Итак, чтобы выполнить инструкцию mutate в вопросе, приведите true и false к одному и тому же классу.
В качестве примечания я будет воссоздавать набор данных, поскольку as.data.frame не требуется, правильный способ - использовать data.frame.

library(dplyr)

a <- factor(c("31","32","43","36","35","46","<31"))
df <- data.frame(a)

mutate(df, b = as.numeric(if_else(a == "<31", "30", as.character(a))))
#    a  b
#1  31 31
#2  32 32
#3  43 43
#4  36 36
#5  35 35
#6  46 46
#7 <31 30
2 голосов
/ 20 февраля 2020

Вы можете использовать fct_recode из forcats и затем преобразовать его в число c.

library(dplyr)
df %>%
  mutate(b = forcats::fct_recode(a, `30` = "<31"), 
         b = as.numeric(as.character(b))) 

#    a  b
#1  31 31
#2  32 32
#3  43 43
#4  36 36
#5  35 35
#6  46 46
#7 <31 30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...