R dplyr / tidyr перекодировать значения столбца - PullRequest
0 голосов
/ 28 апреля 2018

У меня было несколько наборов данных, которые я объединил в 1 кадр данных dplyr с помощью rbind.

GapAnalysis16 <- select(memSat16,
     importance_communication_website_content, 
     satisfaction_communication_website_content,
     status,
     Year2016) %>% 
     rename(ComImpt=importance_communication_website_content, 
     ComSat = satisfaction_communication_website_content,
     status = status,
     year = Year2016)


 GapAnalysis17July <- select(memSatJuly17, 
    importance_communication_website_content_JULY17,
    satisfaction_communication_website_content_JULY17, 
    role_primary_new_JULY17,Year2017_July) %>% 
    rename(ComImpt=importance_communication_website_content_JULY17, 
    ComSat = satisfaction_communication_website_content_JULY17,
    status = role_primary_new_JULY17,
    year = Year2017_July)


 GapAnalysis <- rbind(GapAnalysis17July,GapAnalysis16)

И получил мой новый объединенный набор данных:

   ComImpt ComSat status year
1       4      2      1    1
2      NA     NA      1    1
3       4      5      5    1
4       3      3      5    1
5       6      6      5    1
6       5      5      1    1

Мне нужно было это в полной форме, поэтому преобразовал его:

    GapAnalysis_LongForm <-  GapAnalysis %>%
    gather(key = Product,value = Score, ComSat, ComImpt)

А теперь вот это:

    status  year Product Score
     <dbl> <dbl> <chr>   <dbl>
 1     1.    1. ComSat      2.
 2     5.    1. ComSat      5.
 3     5.    2. ComSat      3.
 4     1.    1. ComSat      5.
 5     1.    1. ComImpt     4.
 6     5.    1. ComSat      4.

Теперь мне нужно перекодировать ComSat и ComImpt в значения (1 и 2), но я в тупике. Recode и recode_factor дают мне ошибки. Я пытаюсь получить вывод примерно так:

    status  year Product Score
     <dbl> <dbl> <chr>   <dbl>
 1     1.    1. 1           2.
 2     5.    1. 1           5.
 3     5.    2. 1           3.
 4     1.    1. 1           5.
 5     1.    1. 2           4.
 6     5.    1. 1           4.

Какие-нибудь общие точки в правильном направлении?

Я ценю это !!!

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Если в вашем data.frame есть только 2 Product кодов (ComSat,ComImpt), тогда простой ifelse будет легче помочь.

Вам необходим дополнительный шаг в цепочке dplyr как: mutate(Product = ifelse(Product=="ComSat", 1L, 2L))

GapAnalysis_LongForm  <- GapAnalysis %>%
  gather(key = Product,value = Score, ComSat, ComImpt) %>%
  mutate(Product = ifelse(Product=="ComSat", 1L, 2L))

#    status year Product Score
# 1       1    1       1     2
# 2       1    1       1    NA
# 3       5    1       1     5
# 4       5    1       1     3
# 5       5    1       1     6
# 6       1    1       1     5
# 7       1    1       2     4
# 8       1    1       2    NA
# 9       5    1       2     4
# 10      5    1       2     3
# 11      5    1       2     6
# 12      1    1       2     5
0 голосов
/ 28 апреля 2018

I думаю у вас возникли некоторые проблемы, потому что вы используете recode_factor за пределами mutate. Когда вы изменяете столбцы фрейма данных, убедитесь, что вы используете mutate (в контексте tidyverse).

Следующее должно работать и делать то же самое.


С базовой factor функцией

df %>%
  mutate(Product = factor(Product, levels = c("ComSat", "ComImpt"), labels = c(1L, 2L)))

С функцией recode_factor

df %>%
  mutate(Product = recode_factor(Product, "ComSat" = 1L, "ComImpt" = 2L))

или

df3 <- df %>%
  mutate_at(vars(Product), ~recode_factor(.,"ComSat" = 1L, "ComImpt" = 2L))
...