如何删除 R 中的一个因子水平?

how do I remove one factor level in R?

我需要从 R 中的数据框中删除变量。我的数据有一列包含 18 个因子:

  1. 农业
  2. 渔业 ...
  3. 未分类

我需要在创建虚拟变量之前删除因子 #18 以表示 "the person X works in the Y industry"。也就是说,我只需要保留前 17 个级别(分类级别)

在 Stata 中删除级别将是

drop if rama1 == 99

(rama1是因子列,99是"unclassified")

然后在 Stata 中创建虚拟变量(每个行业一个二进制变量)我 运行:

quietly tabulate rama1, generate(rama1_)

在 R 中是:

for(i in unique(data$rama1)) {
data[paste("type", i, sep="")] <- ifelse(data$rama1 == i, 1, 0)
}

有什么想法吗?非常欢迎您的帮助

扩展我的评论:

set.seed(1)
df <- data.frame(x=as.factor(sample(LETTERS[1:5],10, replace=TRUE)), y=1:10)
levels(df$x)
# [1] "A" "B" "C" "D" "E"
df <- df[df$x!="E",]        # remove all rows with df$x=="E"
levels(df$x)                # level E remains
# [1] "A" "B" "C" "D" "E"
df$x <- factor(df$x)        # get rid of it...
levels(df$x)
# [1] "A" "B" "C" "D"

请注意,as.factor(...) 不会起作用。

R 还具有 "drop" 级别的功能,毫不奇怪地命名为 droplevels。从上下文来看,我猜测 Stata 的 drop 更像是 R 的 is.na<-,因为它似乎将列中的项目设置为缺失。要防止 R 显示现在的 'missing' 级别,您需要先删除值,然后再删除级别。

创建多列,一列一列"dummy"完全没有必要。我怀疑 Stata 也不需要它。我认为这是一种可以从 SAS 或 SPSS 继承下来的操作。 R 中的回归和 table 操作将通过单列适当地完成。

df <- data.frame(x=as.factor(sample(LETTERS[1:5],100, replace=TRUE)), y=1:100)
levels(df$x)
#[1] "A" "B" "C" "D" "E"
is.na(df$x) <- df$x == "E"
lm( y~x, df)
#--------------
Call:
lm(formula = y ~ x, data = df)

Coefficients:
(Intercept)           xB           xC           xD  
    49.3846      -0.7846       2.9838       2.7692  

如果 df1$rami 是根据 99 测试所建议的数字,那么它无论如何都不是一个因素,并且对级别的讨论没有密切关系。

要移除关卡,BondedDust 或 jlhoward 的方法都可以。要创建虚拟变量,这将取决于您 want/how 您希望它被制定的内容。

例如,对于删除的因素,您希望行显示为 <NA> 还是 0


基础 R

最简单的方法是在 base R 中使用 model.matrix。因此,以 BondedDust 的示例为基础;

df <- data.frame(x=as.factor(sample(LETTERS[1:5],100, replace=TRUE)), y=1:100)

# remove E and the level
is.na(df$x) <- df$x == "E"
df$x <- factor(df$x)

产生这个:

> head(df)
     x y
1    D 1
2    C 2
3    A 3
4 <NA> 4
5    D 5
6    A 6

然后,我们可以简单地 运行 model.matrix 来获得我们因子水平的虚拟变量。默认情况下,它会将所有 NA 更改为 0。

> model.matrix(~x, df)
    (Intercept) xB xC xD
1             1  0  0  1
2             1  0  1  0
3             1  0  0  0
5             1  0  0  1
6             1  0  0  0
8             1  1  0  0
9             1  0  0  0
11            1  0  0  0
12            1  0  1  0

插入符号[=​​39=]

另一种方法是使用 caret 包,当 运行跨 test/holdout 个模型使用这些 factors/releveling 时,它可能会给你更多的力量。

它包含为您执行此操作的 dummyVars 函数。

> xx <- dummyVars(~x, df)
> predict(xx, df)
    x.A x.B x.C x.D
1     0   0   0   1
2     0   0   1   0
3     1   0   0   0
4    NA  NA  NA  NA
5     0   0   0   1
6     1   0   0   0
7    NA  NA  NA  NA