R dplyr / tidyr重新编码列值

时间:2018-04-28 04:31:07

标签: r dplyr tidyr recode key-pair

我有多个数据集,我用rbind合并到1个dplyr数据帧中。

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&amp; 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.

正确方向的任何一般点?

我很感激!!!

3 个答案:

答案 0 :(得分:2)

猜测您遇到了一些问题,因为您在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))

答案 1 :(得分:0)

如果您的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

答案 2 :(得分:0)

修改@hpesoj626 的 mutate_at 方法:

根据 tidyverse,范围动词(_if、_at、_all)已被现有动词中的 cross() 取代(有关详细信息,请参阅 here)。

以下代码应该可以工作:

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