r создайте новую переменную вместо изменения

#r

Вопрос:

Я работаю над расчетами ИМТ. У меня есть следующий код

 mutate(name, bmi = mass / ((height / 100)  ^ 2)) %>%
  mutate(BMI_Value = ifelse(bmi > median(bmi, na.rm = T), "Above Average BMI", "Below Average BMI")) %>% 
  select(name, contains("bmi"))
 

Если я использую mutate подобным образом, то позже я не смогу использовать значение BMI_Value. Поэтому мне было интересно, как я мог бы создать новую переменную, чтобы ее можно было использовать снова


Следите за обновлениями


Хорошо, смотрите этот код ниже, это работает нормально, но я, кажется, не могу снова использовать bmi

 
starwars.df <- starwars
head(starwars)

starwars %>% 
  mutate(name, bmi = mass / ((height / 100)  ^ 2)) 

 

Затем, когда я пытаюсь создать индекс массы тела, как показано ниже, я получаю ошибку, см. Ниже после кода

 
starwars.df <- starwars
head(starwars)

 
starwars$bmi <-  mutate(bmi = mass / ((height / 100)  ^ 2)) 

 

Ошибка при мутации(масса, имт = масса/((рост/100)^2)) :
объект «масса» не найден

Комментарии:

1. Пожалуйста, приведите минимальный воспроизводимый пример. Я прочитал это и не знаю, является ли name это фреймом данных или именем переменной. Кроме того, это должно работать как есть, так что есть кое-что, что вы упустили, что ломает вещи. Если name это фрейм данных, и тогда это может вызвать проблему.

2. Я не понимаю, в чем проблема. Вы создаете столбец с помощью mutate, затем отбрасываете его с помощью select, но затем снова хотите его вернуть…? Если вам нужна колонка, не избавляйтесь от нее

3. Я думаю, что главная проблема заключается в том, что вы печатаете результат, а не обновляете фрейм name данных. Если у меня есть x <- 5 , и я запускаю строку x 1 , результат 6 будет напечатан, но x все равно 5 . Если я хочу изменить x , я использую x <- x 1 для назначения изменения. Та же идея применима и к mutate тому , что если вы хотите name обновить фрейм данных, вам необходимо назначить изменение, name <- mutate(name ...

Ответ №1:

Даже если мне не совсем ясно, что вы делаете, возможно, проблема в том, что вы не сохраняете свои операции в объекте (ваш фрейм данных). Попробуйте добавить -> new_df в конце последней строки, чтобы сохранить все в новом фрейме данных. Затем он должен содержать все вновь созданные переменные.

Кроме того, удалите name на шаге выбора: select(contains("bmi"))


Обновление после обновленного вопроса:

оператор канала %>% не сохраняет ваш кадр данных, поэтому вам просто нужно снова назначить свои операции вашему кадру данных (или новому…).:

 starwars <- starwars %>% 
  mutate(bmi = mass / ((height / 100)  ^ 2)) 
 

или альтернативно:

 starwars %>% 
      mutate(bmi = mass / ((height / 100)  ^ 2)) -> starwars
 

Комментарии:

1. Спасибо за вашу помощь

2. не за что!