直截了当地提问。假设我有以下数据框:
> head(temp)
Gender Age Agegroup
2 Male 63 61+
3 Male 60 50-60
4 Male 55 50-60
5 Male 36 30-39
7 Male 39 30-39
8 Male 63 61+
调用摘要函数:
> summary(temp)
Gender Age Agegroup
Male :864692 Min. :25.00 25-29:0
Female: 0 1st Qu.:35.00 30-39:205237
Median :45.00 40-49:235622
Mean :44.48 50-60:250977
3rd Qu.:54.00 61+ : 68807
Max. :64.00
正如您所看到的,对女性因素和25-29因子水平的观察结果为零。结果,我不需要那些水平。我使用以下代码删除它们:
temp$Gender<-factor(temp$Gender)
temp$Agegroup<-factor(temp$Agegroup)
我的问题是:如何使用apply函数执行我用来删除级别的代码?看起来像:
# Pseudo code just to illustrate my purpose
temp[,c(1,3)]<-apply(temp[,c(1,3)],FUN=factor)
如果我需要更新数据框的大量列的级别,它将非常方便。谢谢。如果您需要更多说明,请与我们联系。
答案 0 :(得分:4)
您正在寻找droplevels
。
以下是与您类似的一些示例数据:
set.seed(1)
mydf <- data.frame(A = factor(rep("M", 5), levels = c("M", "F")),
B = sample(20:50, 5, TRUE))
mydf$C <- cut(mydf$B, seq(0, 80, 10))
mydf
# A B C
# 1 M 28 (20,30]
# 2 M 31 (30,40]
# 3 M 37 (30,40]
# 4 M 48 (40,50]
# 5 M 26 (20,30]
summary(mydf)
# A B C
# M:5 Min. :26 (20,30]:2
# F:0 1st Qu.:28 (30,40]:2
# Median :31 (40,50]:1
# Mean :34 (0,10] :0
# 3rd Qu.:37 (10,20]:0
# Max. :48 (50,60]:0
# (Other):0
现在,让我们使用droplevels
,看看会发生什么:
mydf2 <- droplevels(mydf)
summary(mydf2)
# A B C
# M:5 Min. :26 (20,30]:2
# 1st Qu.:28 (30,40]:2
# Median :31 (40,50]:1
# Mean :34
# 3rd Qu.:37
# Max. :48
如果您真的想使用*apply
方法,也许您可以使用lapply
,如下所示:
mydf3 <- mydf ## Create a copy of your original just in case
mydf3[] <- lapply(mydf3, factor)
summary(mydf3)
# A B C
# M:5 26:1 (20,30]:2
# 28:1 (30,40]:2
# 31:1 (40,50]:1
# 37:1
# 48:1