如何在具有不同因子水平的不同数据帧中的函数中使用Forcats :: Fct_Collapse

麦克风
library(tidyverse)
library(forcats)

我有两个简单的数据框(底部代码),我想通过折叠“动物”列创建一个新的已编码变量。我通常使用forcats :: fct_collapse进行此操作。但是,我想使一个函数将fct_collapse应用于具有相同变量的许多不同数据帧,除了一些可能缺少一个或两个因子水平。例如,在这种情况下,Df2缺少“犀牛”。

有什么办法可以更改代码(使用tiyverse),以便将缺少的因子类别返回为NA?在此示例中,我知道它是“犀牛”,但是在我的实际数据中可能还有其他缺失水平。除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)
爵士乐

这是给你的一个主意。最初,我尝试在函数中包含两个参数。一个用于数据框,另一个用于包含动物名称的列。但是这次尝试失败了。我收到一条错误消息,指出“ mutate_impl(.data,点)中的错误:列的new长度必须为5(行数)或一个,而不是6。” 因此,我决定在函数中不使用列名。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  

备注:除了我有两个参数外,以下函数是相同的。这是行不通的。如果有任何修改的可能,请告诉我。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

FCT_Collapse 使用范围

将fct_collapse函数一次转换为多列

如何在pyspark中使用saveAsTable在每次迭代中保存具有不同表名的spark数据帧

如何在pandas的数据帧列中漂亮地替换具有不同值的不同字符串?

如何使用带有strsplit或类似符号的fct_relabel重新标记因子列?

如何在列中具有不同记录的熊猫数据框中使用正则表达式?

如何在具有不同 col 规格的 R 中使用 Pivot Long 函数?

如何在函数中执行fct_drop(使用整洁的eval)?

如何在具有相同名称的2个不同库中使用2个不同函数

如何在R中使用子函数来更改带有加号(+)的因子水平?

iOS Swift-如何在具有不同数据的collectionview中使用2个表视图

在跨两个不同数据帧映射索引时,如何在熊猫中使用apply函数?

如何应用从不同数据帧获取数据并具有条件的函数?

将相同因子水平应用于R中具有不同水平数量的多个变量

如何在 R 中合并具有不同长度和两个条件的两个数据帧?

如何在ggplot2中绘制具有不同因子的一维点的密度

如何使用R根据匹配查找数据帧替换数据帧的多个列中的因子水平

应用具有来自两个不同数据帧的参数的函数,并使用 group by。(熊猫)

在 R 中的函数内使用 fct_recode

匹配具有不同因子水平的两列

如何在类型化数据集xsd中使用具有相同表结构的不同数据库

如何处理具有相同ID但Python列中的值不同的数据帧中的记录

使用forcats包中的fct_relevel()将ggplot2中的变量重新排序一级以上

如何在数据帧R中使用group by获取计数和不同计数

如何反转数据帧中具有不同长度的个体的观察顺序

如何基于R中的长格式数据帧创建具有不同列长的Markdown表?

如何从R中具有不同行数的列表转换数据帧?

使用apply()函数更新R中数据帧的多列的因子水平

使用R在具有不同编号的多个数据帧中创建变量