2016-06-21 19 views
0

下面是兩個簡單的數據幀。我想重新編碼(摺疊)Sat1Sat2列,以便所有滿意度都編碼爲Satisfied,所有不滿度都編碼爲Dissatisfied。中性將保持中性。這些因素將因此有三個級別 - Satisfied, Dissatisfied, and Neutral使用Purrr和Dplyr對多個數據幀重新編碼相似的因子水平

我通常通過結合所述數據幀,並使用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,以及dplyr,tidyr , stringr and ggplot2`因此一切都可以很容易地流水線。

下面的例子是我想要完成的,但是對於重新編碼,但是我無法使它工作。

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

我想用at_map或類似的映射函數,這樣我可以保持Sat1Sat2原始列,因此再編碼的列將被添加到所述數據幀和重命名。如果這個步驟也可以包含在一個函數中,那將會很棒。

實際上,我會有很多數據幀,所以我只想重新編碼因子水平一次,然後使用purrr中的函數使用最少量的代碼對所有數據幀進行更改。

Names<-c("James","Chris","Jessica","Tomoki","Anna","Gerald") 
Sat1<-c("Satisfied","Very Satisfied","Dissatisfied","Somewhat Satisfied","Dissatisfied","Neutral") 
Sat2<-c("Very Dissatisfied","Somewhat Satisfied","Neutral","Neutral","Satisfied","Satisfied") 
Program<-c("A","B","A","C","B","D") 
Pets<-c("Snake","Dog","Dog","Dog","Cat","None") 

DF1<-data.frame(Names,Sat1,Sat2,Program,Pets) 

Names<-c("Tim","John","Amy","Alberto","Desrahi","Francesca") 
Sat1<-c("Extremely Satisfied","Satisfied","Satisfed","Somewhat Dissatisfied","Dissatisfied","Satisfied") 
Sat2<-c("Dissatisfied","Somewhat Dissatisfied","Neutral","Extremely Dissatisfied","Somewhat Satisfied","Somewhat Dissatisfied") 
Program<-c("A","B","A","C","B","D") 


DF2<-data.frame(Names,Sat1,Sat2,Program) 
+0

你想要所有的數據幀結尾或單獨存儲在一個列表或...?從dplyr_0.4.3.9000結合'map'或'map_df',像'mutate_each'這樣的東西看起來相當簡單。 'map_at'看起來像代替了當前的變量,所以在這種情況下可能不是使用的工具。 – aosmith

+0

感謝您的回覆。如果數據幀分開保存在列表中,我想這沒關係。我的主要目標是找到一個快速方法(在purrr dplyr管道中),這將允許我一次性重新編碼跨多個數據幀的因素。我喜歡結合mutate_each和map函數的想法。沒關係,如果當前變量被替換了,因爲我可以先複製數據幀。所以,如果你能爲你的例子展示代碼,我將不勝感激。 – Mike

回答

1

一種方法是使用mutate_each做的工作與的map功能要經過data.frames的列表中選擇一個組合。使用mutate_each的等效項dplyr_0.4.3.9001允許您重命名新的列。

在這種情況下,您可以使用字符串操作而不是重新編碼。我相信你想從當前的字符串中取出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 

要經過存儲在一個列表許多數據集,您可以使用map功能從purrr到列表中的每個元素執行的功能。

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 
... 
+0

謝謝,這正是我一直在尋找的! – Mike

+0

list(DF1,DF2)%>%map(〜mutate(。,SatREC = Sat1%>%recode(''Extremely Satisfied「=」Satisfied「'))) – Mike

+0

快速問題,使用上面的答案,與使用地圖和mutate,這是有效的汽車recode功能。代碼在上面的註釋中。但是,如何使用mutate_each編寫相同的代碼,並同時包含Sat1和Sat2? – Mike

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) 
+0

感謝您的回覆。它給了我一些想法,因爲我之前沒有想過使用這種方法重新編碼。不過,我仍然希望得到一個使用purrr map函數的答案。 – Mike

+0

啊,這個模式可能會寫一個函數f來重新編碼一個單獨的向量,然後使用'df [] < - map_at(df,c(「SAT1」,「SAT2」),f)' – Shorpy

+0

是的,這就是我想要做的。我想現在我需要弄清楚這個功能。我沒有太多成功創建一個函數來摺疊上面例子中的因素。你能幫我解決代碼嗎? – Mike

相關問題