r - 关于定义因子变量的一些混淆
问题描述
在 RI 中定义因子变量时,到目前为止已将它们定义为:
q5_data$high <- ifelse(q5_data$totexp >median(q5_data$totexp),1,0)
但是我注意到人们使用诸如:
factor(directions, levels= c("North", "East", "South", "West"))
我是否必须将因子变量显式定义为因子变量,或者仅使用 1 和 0 的向量?
解决方案
这个问题实际上是两个问题。
1.
在 R 中,很少需要创建虚拟变量(如果有的话)。R 的建模功能会自动处理这些问题。但是,如果您想将数字变量二分,在问题的示例中将其设为低于或高于中位数的值,ifelse
这只是其中一种方法。
这是另外两个(基本上相同的方式)。他们利用FALSE/TRUE
编码为整数的事实0/1
并将逻辑值强制转换为数字类。
set.seed(2021)
x <- runif(10, 0, 100)
y <- ifelse(x > median(x), 1, 0)
z <- as.integer(x > median(x))
identical(y, z)
#[1] FALSE
结果是FALSE
因为尽管值相等,但对象的类却不相等。
class(y)
#[1] "numeric"
class(z)
#[1] "integer"
除非需要结果,否则解决方案不会关心这identical
一点。
z2 <- as.numeric(x > median(x))
identical(y, z2)
#[1] TRUE
要了解为什么这可能不需要,回归函数将自己调用它,运行以下命令。输出省略。
model.matrix(~ x > median(x))
2.
另一个问题是对数据进行分箱。如果您想从数值变量中创建小、中和大的因子,可以使用 或 之类cut
的函数.bincode
。findInterval
i <- findInterval(x, c(0, 33.33, 66.67, Inf))
levels <- c("Small", "Medium", "Large")
f <- factor(levels[i], levels = levels)
f
# [1] Medium Large Large Medium Medium Large Medium Small Large
#[10] Large
#Levels: Small Medium Large
为什么我要明确设置因子水平?因为 R 将默认为字典顺序,并且"Large"
是第一个,然后"Medium"
和"Small"
将被分配给最大值。手动分配因子水平可以完全控制结果。
推荐阅读
- express - passport.authenticate 无法正常工作
- c++ - Chicken Egg Class Interface in C++
- r - 正则表达式编写您自己的 NGram 分词器
- python - Alembic:AttributeError:“RedshiftDDLCompiler”对象没有属性“访问子句”
- mysql - SQL OrderBy 子句不适用于最大别名
- reactjs - 如何在 MaterialUI 中从 Select 中更改 Menu 下拉元素?
- google-cloud-platform - GCP VPC 服务控制允许从 VM SSH 浏览器下载
- aws-api-gateway - API Gateway Lambda 代理和 Cognito
- r - 由于 CPL_write_ogr 错误,写入 sf 对象失败
- java - 重构在矩阵中给出最大路径和的路径