R:因子标签如何映射到data.frame中的正确值?

时间:2018-04-04 17:18:17

标签: r dataframe

编辑:包括我阅读的文档,我仍然不清楚

我是R的新手并且正在使用预装了mtcars data.frame的RStudio。我正在将cyl变量转换为因子并标记它们。我的代码是:

df <- mtcars
str(df)
df$cyl <- factor(df$cyl, labels = c('Four cylinder', 'Six Cylinder', 'Eight Cylinder'))
str(df)

哪个输出:

> df <- mtcars
> str(df)
'data.frame':   32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
> df$cyl <- factor(df$cyl, labels = c('Four cylinder', 'Six Cylinder', 'Eight Cylinder'))
> str(df)
'data.frame':   32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : Factor w/ 3 levels "Four cylinder",..: 2 2 1 2 3 2 3 1 1 2 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

我的问题是: factor部分代码如何正确分配标签(即'Four cylinder',在转换后表示为1正在在原始4中正确分配了df s。它只是按升序将标签应用为默认行为吗?如果我有一个字段,例如10个我想要转换为因子的唯一值,该怎么办?如何确定我的标签和替换值是否与正确的原始值相对应?

?factor州访问的文档:

  

级别:x可能采用的值(作为字符串)的可选向量。默认值是as.character(x)采用的唯一值集,按x的递增顺序排序。

这似乎表明标签是按原始变量值按升序应用的,但我只是想确保我理解正确。

1 个答案:

答案 0 :(得分:1)

它知道在这个例子中,因为它将mtcars $ cyl中的数值转换为字符向量c(4, 6, 8, 6, ...) -> c("4", "6", "8", ...),所以通过alphnumerical sort('4'然后'6',然后'8';由于您未在levels调用中指定factor,因此df$cylvalues相匹配,可以找到存储在levels中的数值}。标签并没有真正影响因子排序:你可以反过来将标签“六个圆柱”与级别“4”相匹配。

  

as.numeric(factor(c(4,6,8,6,6,4)))   [1] 1 2 3 2 2 1