如何删除 R 中的一个因子水平?
how do I remove one factor level in R?
我需要从 R 中的数据框中删除变量。我的数据有一列包含 18 个因子:
- 农业
- 渔业
...
- 未分类
我需要在创建虚拟变量之前删除因子 #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
我需要从 R 中的数据框中删除变量。我的数据有一列包含 18 个因子:
- 农业
- 渔业 ...
- 未分类
我需要在创建虚拟变量之前删除因子 #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