1
library(tidyverse)
library(forcats)

2 つの単純なデータフレーム (下部のコード) があり、「Animal」列を折りたたんで新しい再コード化された変数を作成したいと考えています。私は通常これを forcats::fct_collapse で行います。ただし、同じ変数を持つ多くの異なるデータフレームに fct_collapse を適用する関数を作成したいと考えています。たとえば、この場合、Df2 には「Rhino」がありません。

欠落している因子カテゴリが NA として返されるように (tiyverse を使用して) コードを変更する方法はありますか? この例では、それが「Rhino」であることはわかっていますが、実際のデータでは、他のレベルが欠落している可能性があります。forcats::fct_collapse 以外のオプションも受け入れますが、tidyverse の範囲内にとどまりたいと考えています。

REC <- function(Df, Data){

Df %>% 
mutate(NEW = fct_collapse(Data, One = c("Cat","Dog","Snake"),
                          Two = c("Elephant","Bird","Rhino")))
}

REC(Df1,Animal) - this works
REC(DF2,Animal) - this doesn't, it throws an error because of "Rhino"

サンプルデータ:

Animal <- c("Cat","Dog","Snake","Elephant","Bird","Rhino")
Code <- c(101,222,434,545,444,665)
Animal2 <- c("Cat","Dog","Snake","Elephant","Bird")
Code2 <- c(101,222,434,545,444)

Df1 <- data_frame(Code, Animal)

Df2 <- data_frame(Code2, Animal2) %> %rename(Animal = Animal2)
4

1 に答える 1

0

ここに 1 つのアイデアがあります。私は当初、関数に 2 つの引数を持たせようとしました。1 つはデータ フレーム用で、もう 1 つは動物名を含む列です。しかし、この試みは失敗しました。new「mutate_impl(.data, ドット) のエラー: 列の長さは 6 ではなく 5 (行数) または 1 でなければなりません」というエラー メッセージが表示されました。そのため、関数に列名を含めないことにしました。Animal私は自分の機能ではっきりと言いました。その後、物事はうまくいきました。アイデアは、動物の名前が欠落している因子変数を作成することでした。それは で行われましfactor()setdiff()。すべての動物の名前を取得したら、fct_collapse().

myfun <- function(mydf){

         animals <- c("Cat", "Dog", "Snake", "Elephant", "Bird", "Rhino")

         mydf %>%
         mutate(new =  factor(Animal, levels = c(unique(Animal), setdiff(animals, Animal))),
                new = fct_collapse(new, One = c("Cat", "Dog", "Snake"),
                                       Two = c("Elephant", "Bird", "Rhino"))) -> x
         x}

> myfun(Df2)
# A tibble: 5 x 3
  Code2 Animal   new  
  <dbl> <chr>    <fct>
1   101 Cat      One  
2   222 Dog      One  
3   434 Snake    One  
4   545 Elephant Two  
5   444 Bird     Two  

> myfun(Df1)
# A tibble: 6 x 3
   Code Animal   new  
  <dbl> <chr>    <fct>
1   101 Cat      One  
2   222 Dog      One  
3   434 Snake    One  
4   545 Elephant Two  
5   444 Bird     Two  
6   665 Rhino    Two  

メモ: 次の関数は、引数が 2 つある以外は同じです。これは機能していません。修正が可能な場合は、お知らせください。

myfun2 <- function(mydf, mycol){

         animals <- c("Cat", "Dog", "Snake", "Elephant", "Bird", "Rhino")

         mydf %>%
         mutate(new =  factor(mycol, levels = c(unique(mycol), setdiff(animals, mycol))),
               new = fct_collapse(new, One = c("Cat", "Dog", "Snake"),
                                       Two = c("Elephant", "Bird", "Rhino"))) -> x
        x}

> myfun2(Df2, Animal)
Error in mutate_impl(.data, dots) : 
Column `new` must be length 5 (the number of rows) or one, not 6
于 2018-02-02T05:29:00.750 に答える