1

以下は、2 つの単純なデータ フレームです。すべての満足度が として単純にコード化され、すべての不満足度がとしてコード化されるように、Sat1および列を再コード化 (折りたたみ) したいと思います。ニュートラルはニュートラルのままです。したがって、これらの要因には 3 つのレベルがあります。Sat2SatisfiedDissatisfiedSatisfied, 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マップの他のバージョンを提案するのは初めてなので、tidyr stringr ggplot2`purrrだけでなく、すべてを簡単にパイプライン処理できるようにします.dplyr,and

以下の例は、私が達成したいことですが、再コーディング用ですが、機能させることができませんでした。

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

Sat1との元の列を保持できるように、at_map または同様のマップ関数を使用したいSat2ので、再コード化された列がデータ フレームに追加され、名前が変更されます。このステップも関数内に含めることができれば素晴らしいことです。

実際には、多くのデータ フレームがあるため、因子レベルを 1 回だけ再コード化し、関数を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)
4

2 に答える 2

1

これを行う 1 つの方法は、data.frames のリストを通過する関数mutate_eachの 1 つと組み合わせて作業を行うために使用することです。mapdplyr_0.4.3.9001mutate_eachからまたは同等のものを使用すると、新しい列の名前を変更できます。

この場合、再コーディングの代わりに文字列操作を使用できます。Satisfiedあなたは今持っている文字列から、Dissatisfied、またはを引き出したいと思っていると思いNeutralます。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を使用して、これらの関数の 1 つを複数の列で使用できます。関数にfuns付けた名前が、新しい列名に追加されます。使用しrecodeました。データセットの 1 つについて:

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

リストに保存されている多くのデータセットを調べるには、 purrrmapの関数を使用して、リスト内のすべての要素に対して関数を実行できます。

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
...
于 2016-06-22T14:33:59.433 に答える
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)
于 2016-06-21T18:27:45.453 に答える