使用Purrr和Dplyr在多个数据帧中重新编码相似的因子水平

时间:2016-06-21 18:17:46

标签: r dplyr purrr

以下是两个简单的数据框。我想重新编码(折叠)Sat1Sat2列,以便将所有满意度编码为Satisfied,并将所有不满意度编码为{{1 }}。中性仍为中性。因此,这些因素将有三个级别 - Dissatisfied

我通常会通过绑定数据框,使用Satisfied, Dissatisfied, and Neutral以及lapply包中的重新代码来完成此操作,例如:

car

我想使用地图功能完成此操作,特别是 DF1[2:3] <- lapply(DF1[2:3], recode, c('"Somewhat Satisfied"= "Satisfied","Satisfied"="Satisfied","Extremely Dissatisfied"="Dissatisfied"........etc, etc (为了维护数据框,但我是at_map的新手,所以请随意提出其他版本的地图) purrr,以及purrr,tidyr dplyr stringr , ggplot2`所以一切都可以轻松管道化。

以下示例是我想要完成的,但是对于重新编码,但我无法使其工作。

http://www.r-bloggers.com/using-purrr-with-dplyr/

我想使用at_map或类似的map函数,以便保留andSat1的原始列,因此重新编码的列将被添加到数据框并重命名。如果这个步骤也可以包含在一个函数中,那将会很棒。

实际上,我将拥有许多数据帧,所以我只想重新编码因子级别一次,然后使用Sat2中的函数使用最少量的代码在所有数据帧中进行更改。

purrr

2 个答案:

答案 0 :(得分:1)

我通过连接进行大量的这样的重新编码,在这种情况下,我认为转换为长数据帧会使问题更容易思考。

library(tidyr)
library(dplyr)

mdf <- DF1 %>% 
  gather(var, value, starts_with("Sat"))

recode_df <- data_frame( value = c("Extremely Satisfied","Satisfied","Somewhat Dissatisfied","Dissatisfied"),
                         recode = 1:4)
mdf <- left_join(mdf, recode_df)
mdf %>% spread(var, recode)

答案 1 :(得分:1)

执行此操作的一种方法是使用mutate_each结合其中一个map函数完成工作,以浏览data.frames列表。使用 dplyr_0.4.3.9001 中的mutate_each或等效文件,您可以重命名新列。

在这种情况下,您可以使用字符串操作而不是重新编码。我相信您想从当前的字符串中提取SatisfiedDissatisfiedNeutral。您可以使用正则表达式使用sub来实现此目的。例如,

sub(".*(Satisfied|Dissatisfied|Neutral).*$", "\\1", DF2$Sat2)
"Dissatisfied" "Dissatisfied" "Neutral"      "Dissatisfied" "Satisfied"    "Dissatisfied"

stringr 有一个很好的函数来提取特定的字符串str_extract

library(stringr)
str_extract(DF2$Sat2, "Satisfied|Neutral|Dissatisfied")
 "Dissatisfied" "Dissatisfied" "Neutral"      "Dissatisfied" "Satisfied"    "Dissatisfied"

您可以在mutate_each中使用此功能在多列上使用这些功能之一。您为funs中的函数指定的名称将添加到新列名称中。我用了recode。对于您的一个数据集:

DF1 %>% 
    mutate_each( funs(recode = str_extract(., "Satisfied|Neutral|Dissatisfied") ), 
              starts_with("Sat") )

    Names               Sat1               Sat2 Program  Pets  Sat1_recode  Sat2_recode
1   James          Satisfied  Very Dissatisfied       A Snake    Satisfied Dissatisfied
2   Chris     Very Satisfied Somewhat Satisfied       B   Dog    Satisfied    Satisfied
3 Jessica       Dissatisfied            Neutral       A   Dog Dissatisfied      Neutral
4  Tomoki Somewhat Satisfied            Neutral       C   Dog    Satisfied      Neutral
5    Anna       Dissatisfied          Satisfied       B   Cat Dissatisfied    Satisfied
6  Gerald            Neutral          Satisfied       D  None      Neutral    Satisfied

要浏览存储在列表中的许多数据集,您可以使用 purrr 中的map函数对列表中的每个元素执行一个函数。

list(DF1, DF2) %>%
    map(~mutate_each(.x, 
                  funs(recode = str_extract(., "Satisfied|Neutral|Dissatisfied") ), 
                  starts_with("Sat")) )

[[1]]
    Names               Sat1               Sat2 Program  Pets  Sat1_recode  Sat2_recode
1   James          Satisfied  Very Dissatisfied       A Snake    Satisfied Dissatisfied
2   Chris     Very Satisfied Somewhat Satisfied       B   Dog    Satisfied    Satisfied
...
[[2]]
      Names                  Sat1                   Sat2 Program  Sat1_recode  Sat2_recode
1       Tim   Extremely Satisfied           Dissatisfied       A    Satisfied Dissatisfied
2      John             Satisfied  Somewhat Dissatisfied       B    Satisfied Dissatisfied
...

使用map_df代替将列表中的所有元素绑定到data.frame,这可能是您想要的,也可能不是。使用.id参数为每个原始数据集添加一个名称。

list(DF1, DF2) %>%
    map_df(~mutate_each(.x, 
                  funs(recode = str_extract(., "Satisfied|Neutral|Dissatisfied")), 
                  starts_with("Sat")), .id = "Group")

   Group     Names                  Sat1                   Sat2 Program  Pets  Sat1_recode
1      1     James             Satisfied      Very Dissatisfied       A Snake    Satisfied
2      1     Chris        Very Satisfied     Somewhat Satisfied       B   Dog    Satisfied
3      1   Jessica          Dissatisfied                Neutral       A   Dog Dissatisfied
4      1    Tomoki    Somewhat Satisfied                Neutral       C   Dog    Satisfied
5      1      Anna          Dissatisfied              Satisfied       B   Cat Dissatisfied
6      1    Gerald               Neutral              Satisfied       D  None      Neutral
7      2       Tim   Extremely Satisfied           Dissatisfied       A  <NA>    Satisfied
8      2      John             Satisfied  Somewhat Dissatisfied       B  <NA>    Satisfied
...