关于定义因子变量的一些混淆
Some confusion regarding defining factor variables
在 R 中定义因子变量时,到目前为止我都是这样定义它们的:
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
并将逻辑值强制转换为数字 class.
这一事实
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 不相等。
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
or 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"
就会被赋值给最大值。手动分配因子水平可以完全控制结果。
在 R 中定义因子变量时,到目前为止我都是这样定义它们的:
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
并将逻辑值强制转换为数字 class.
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 不相等。
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
or 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"
就会被赋值给最大值。手动分配因子水平可以完全控制结果。