我需要从R中的数据框中删除变量。我的数据有一个包含18个因子的列:
我需要在创建虚拟变量之前删除因子#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)
}
任何想法?非常欢迎您的帮助
答案 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(...)
无效。