[英]Combining Factor Levels from a Dataframe in R
我有三個級別的類型factor
變量: Fatal injury
, Non-fatal injury
和PD 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 injury
和fatal injury
與Fatalities
相結合。 最后,使用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解決方案,而不是第一個解決方案(在factor()
使用labels
),因為當您在數據中具有更多級別時,它將使工作變得更輕松。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.