如何删除R中的一个因子级别?

时间:2015-08-30 20:42:37

标签: r stata

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

  1. 农业
  2. 渔业 ...
  3. 未分类
  4. 我需要在创建虚拟变量之前删除因子#18,以说“人X在Y行业中起作用”。这是,我只需要保留前17个级别(分类级别)

    在Stata中删除级别将是

    drop if rama1 == 99
    

    (rama1是因子列,99是“未分类”)

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

    quietly tabulate rama1, generate(rama1_)
    

    在R中是:

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

    任何想法?非常欢迎您的帮助

3 个答案:

答案 0 :(得分:1)

R还具有以下功能:&#34; drop&#34;这个级别,名不见经传,droplevels。从上下文来看,我猜测Stata的drop更像是R is.na<-,因为它似乎是在列中设置项目丢失。为了防止R显示现在缺少的&#39;您需要先删除值然后删除级别的级别。

创建多个列,每个列一个&#34;虚拟&#34;完全没必要。我怀疑Stata也不需要它。我认为这可能是SAS或SPSS可能带来的那种操作。 R中的回归和表操作将使用单个列进行适当的操作。

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进行测试所建议的数字,那么它无论如何都不是一个因素,并且对级别的讨论并不是密切相关的。

答案 1 :(得分:1)

要删除级别,BondedDust或jlhoward接近的方式都可正常工作。要创建虚拟变量,它将取决于您想要什么/如何制定它。

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

基础R

最简单的方法是在基础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来获取因子级别的虚拟变量。默认情况下,它会将所有NAs更改为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

<强>插入符

另一种方法是使用插入符号包,这可以在运行这些因子/重新调整测试/保持模型时为您提供更多功能。

它包含为您执行此操作的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

答案 2 :(得分: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(...)无效。