首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在具有不同因子级别的不同数据帧中使用Forcats::Fct_Collapse

如何在具有不同因子级别的不同数据帧中使用Forcats::Fct_Collapse
EN

Stack Overflow用户
提问于 2018-02-02 11:35:13
回答 1查看 2.3K关注 0票数 1
代码语言:javascript
复制
library(tidyverse)
library(forcats)

我有两个简单的数据帧(底部的代码),我想通过折叠"Animal“列来创建一个新的重新编码的变量。我通常使用forcats::fct_collapse来做这件事。但是,我想创建一个函数,将fct_collapse应用于许多具有相同变量的不同数据帧,只是有些数据帧可能缺少一个或两个因子级别。例如,在本例中,Df2缺少"Rhino“。

有没有一种方法可以更改代码(使用tiyverse),以便缺少的因子类别将作为NA返回?在这个例子中,我知道它是"Rhino",但在我的真实数据中,可能还有其他缺失的级别。我对forcats::fct_collapse之外的其他选择持开放态度,但我希望停留在tidyverse的领域内。

代码语言:javascript
复制
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"

示例数据:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-02 13:29:01

这里有一个给你的想法。我最初尝试在我的函数中有两个参数。一个是数据框,另一个是包含动物名称的列。但是这次尝试失败了。我收到一条错误消息,提示“mutate_impl(.data,dots)中的错误:列长度必须是5(行数)或1,而不是6。”因此,我决定在函数中不使用列名;我在函数中明确地指定了Animal。然后,事情就成功了。这个想法是创建一个缺少动物名称的因子变量。这是用setdiff()factor()中完成的。一旦我有了所有动物的名字,我就用了fct_collapse()

代码语言:javascript
复制
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  

Memo:下面的函数是相同的,除了我有两个参数。这不管用。如果有任何修改,请让我知道。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48575338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档