Ошибка с mutate () при использовании символов в R - PullRequest
0 голосов
/ 02 апреля 2019

Я работаю с набором данных, похожим на это:

test_accuracy <- data.frame(observed = c("Feeding/Moving", "Moving/Feeding", 
"Moving/Feeding", "Moving/Feeding", "Feeding/Moving", "Feeding/Moving"),
                            predicted = c("Standing", "Standing", 
"Standing", "Standing", "Standing", "Moving/Feeding"))

Я пытаюсь преобразовать свои данные, заменив некоторые символы в столбце predicted, например:

1) заменить Feeding/Moving на Standing

2) заменить Standing на Moving/Feeding

3) заменить Moving/Feeding на Feeding/Moving

Я попытался компактно применить это преобразование, используя приведенный ниже код, и получил следующие ошибки:

> test_accuracy<-test_accuracy %>%
+ mutate(predicted = case_when(predicted == 'Feeding/Moving' ~ 'Standing',
+                                predicted == 'Standing' ~ 'Moving/Feeding',
+                                predicted == 'Moving/Feeding' ~ 'Feeding/Moving',
+                                TRUE ~ predicted)) %>%
+ 
+ 
+ head(test_accuracy)
Error in mutate_impl(.data, dots) : 
  Evaluation error: must be type character, not integer
Call `rlang::last_error()` to see a backtrace.

Однако, при попытке исправить путем установки типа на character, я получаю сообщение об ошибке, противоположное:

> test_accuracy<-as.character(test_accuracy)
> test_accuracy<-test_accuracy %>%
+ mutate(predicted = case_when(predicted == 'Feeding/Moving' ~ 'Standing',
+                                predicted == 'Standing' ~ 'Moving/Feeding',
+                                predicted == 'Moving/Feeding' ~ 'Feeding/Moving',
+                                TRUE ~ predicted)) %>%
+ 
+ 
+ head(test_accuracy)
Error in UseMethod("mutate_") : 
  no applicable method for 'mutate_' applied to an object of class "character"

Любая идея о том, как я могу достичь желаемого преобразования, описанного выше с этим набором данных? Любая помощь приветствуется!

1 Ответ

0 голосов
/ 02 апреля 2019

Когда я сталкиваюсь с такого рода проблемами с несколькими категориями, я использую вложенные функции ifelse(), чтобы включить их в функцию mutate().Я предлагаю следующее:

df <- data.frame(observed = c("Feeding/Moving", "Moving/Feeding", 
"Moving/Feeding", "Moving/Feeding", "Feeding/Moving", "Feeding/Moving"),
                 predicted = c("Standing", "Standing", "Standing", "Standing", 
"Standing", "Moving/Feeding"))

new_df <- df %>% 
  mutate(new_observed = ifelse(observed == "Standing", "Moving/Feeding", 
         ifelse(observed == "Moving/Feeding", "Feeding/Moving", "Standing")),
         new_predicted = ifelse(predicted == "Standing", "Moving/Feeding", 
         ifelse(predicted == "Moving/Feeding", "Feeding/Moving", "Standing")))

Обратите внимание, что вторая функция ifelse() помещена в качестве третьего аргумента в первую функцию ifelse(), чтобы создать новое условие, если первое условие не True,В результате получается следующее (извините, если я неправильно понял приведенные выше правила замены):

> new_df
        observed      predicted   new_observed  new_predicted
1 Feeding/Moving       Standing       Standing Moving/Feeding
2 Moving/Feeding       Standing Feeding/Moving Moving/Feeding
3 Moving/Feeding       Standing Feeding/Moving Moving/Feeding
4 Moving/Feeding       Standing Feeding/Moving Moving/Feeding
5 Feeding/Moving       Standing       Standing Moving/Feeding
6 Feeding/Moving Moving/Feeding       Standing Feeding/Moving
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...