结合R中数据帧的因子水平

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结合R中数据帧的因子水平相关的知识,希望对你有一定的参考价值。

我有factor类型的变量有三个级别:Fatal injuryNon-fatal injuryP.D. only

     head(OttawaCollisions$Collision_Classification)
[1] P.D. only        Non-fatal injury P.D. only        P.D. only        P.D. only        P.D. only       
Levels: Fatal injury Non-fatal injury P.D. only

如何将“致命伤”和“非致命伤”合并到一个单一级别,以便将伤亡加重?

更好的是,我甚至能以某种方式消除死亡事故吗?在这种情况下,我需要从数据框中删除致命的每个实例,而不仅仅是编码NA或其他东西。

答案

数据:

x <- factor( rep( c('P.D. only', 'Non-fatal injury' , 'fatal injury'), 2) )
x
# [1] P.D. only        Non-fatal injury fatal injury     P.D. only       
# [5] Non-fatal injury fatal injury    
# Levels: fatal injury Non-fatal injury P.D. only

代码:您可以使用labels参数重命名级别。忽略重复级别的警告。在这里Non-fatal injuryfatal injuryFatalities结合在一起。最后,使用droplevels()函数删除重复的级别。

x <- factor( x = x, 
             levels = c('P.D. only', 'Non-fatal injury' , 'fatal injury'),
             labels = c('P.D. only', 'Fatalities', 'Fatalities'))
# [1] P.D. only  Fatalities Fatalities P.D. only  Fatalities Fatalities
# Levels: P.D. only Fatalities Fatalities

droplevels(x)
# [1] P.D. only  Fatalities Fatalities P.D. only  Fatalities Fatalities
# Levels: P.D. only Fatalities

编辑:根据您的数据框名称组合代码

OttawaCollisions$CollisionClass <- factor( x = OttawaCollisions$CollisionClass, 
                                           levels = c('P.D. only', 'Non-fatal injury' , 'fatal injury'),
                                           labels = c('P.D. only', 'Fatalities', 'Fatalities'))
OttawaCollisions$CollisionClass <- droplevels(OttawaCollisions$CollisionClass)

EDIT2:data.table解决方案。

library('data.table')
setDT(OttawaCollisions)
OttawaCollisions[ i = CollisionClass %in% c( "fatal injury", "Non-fatal injury"), 
                  j = CollisionClass := "Fatalities"]
OttawaCollisions[, CollisionClass := droplevels(CollisionClass) ]

EDIT3:另一个基础R解决方案。我更喜欢这个基本的R解决方案,而不是第一个(在labels中使用factor()),因为当数据中有更多级别时,它会让生活更轻松。

OttawaCollisions$CollisionClass <- as.character(OttawaCollisions$CollisionClass)
OttawaCollisions$CollisionClass <- factor( with(OttawaCollisions, 
                                                replace( CollisionClass, 
                                                         CollisionClass %in% c( "fatal injury", "Non-fatal injury"),
                                                         "Fatalities") ) )
另一答案

您还可以直接重新分配级别:

> test_df <- tibble(x=as.factor(c('Fatal','Non-fatal','PD','Fatal','Non-fatal','PD')), y=1:6)
> test_df
# A tibble: 6 x 2
  x             y
  <fct>     <int>
1 Fatal         1
2 Non-fatal     2
3 PD            3
4 Fatal         4
5 Non-fatal     5
6 PD            6
> levels(test_df$x)
[1] "Fatal"     "Non-fatal" "PD"       

现在您已了解订单,请替换要组合的级别名称:

> levels(test_df$x) <- c("Fatal","Other","Other")
> test_df
# A tibble: 6 x 2
  x         y
  <fct> <int>
1 Fatal     1
2 Other     2
3 Other     3
4 Fatal     4
5 Other     5
6 Other     6

然后你可以做额外的处理,例如:

> library(dplyr)
> test_df %>% group_by(x) %>% summarize(n)
# A tibble: 2 x 2
  x         n
  <fct> <dbl>
1 Fatal  45.0
2 Other  45.0

以上是关于结合R中数据帧的因子水平的主要内容,如果未能解决你的问题,请参考以下文章

R语言编程艺术_第六章_因子和表

R:ggplot 中的因子水平被视为连续数据集

R语言数据预处理:将指定的分类变量转化为因子变量通过levels参数指定因子水平通过labels参数指定因子标签

通过 geom_tile ggplot R 的热图 - 正确组织每月因子的 y 轴水平

R因子

R中的鬼因子水平[重复]