R - 获取因子中数值与水平标签之间的联系

R - Obtain the connection between the numeric values and the level labels in a factor

我正在努力寻找 R 因子对象中存在的数字(整数)值与其级别标签之间的联系。我知道如何定义级别和标签。但是假设我得到一个 不熟悉的 数据集,我会在其中找到几个因素(此处:性别和颜色):

test <- data.frame(
                   factor(c(1,2,1,1,2,2,1),
                          levels= c(1,2),
                          labels = c("female", "male")
                          ),
                   factor(c(3,2,2,1,4,4,5),
                          levels= c(1,2,3,4,5),
                          labels= c("red", "green", "blue", "yellow", "brown")
                          )
                  )

names(test) <- c("sex", "color")
test

      sex  color
 1 female   blue
 2   male  green
 3 female  green
 4 female    red
 5   male yellow
 6   male yellow
 7 female  brown

我将能够通过使用 attributes() 获得级别标签,并且我将能够获得数值,例如通过使用 test$sex <- as.numeric(test$sex)
但是我怎么知道 1 等于女性而 2 等于男性呢?颜色也是一样(甚至更糟)。如何建立连接?

谢谢

当你有输出时,

test$sex
[1] female male   female female male   male   female
Levels: female male

在名为 "Levels" 的行中,第一个是 'female',第二个是 'male',因此 'female' 等于 1,而 'male' 等于2.

如果你想改变 'male' 为 1 而 'female' 为 2,你应该阅读函数 relevel:

test$sex <- relevel(test$sex, ref = "male")
test$sex 
[1] female male   female female male   male   female
Levels: male female

现在"Levels:"中的'male'是第一个。

因子是有序的,当你转换为 as.numeric 时,你可以得到因子水平,所以你可以这样做:

factors <-data.frame(levels = as.numeric(test$color)[1:length(levels(test$color))], names = paste(levels(test$color)))

factors

正如其他人所说,整数值只是沿着级别的长度递增。就个人而言,我发现这在参考文献中最容易形象化 table。

test <- data.frame(
  sex = factor(c(1,2,1,1,2,2,1),
               levels= c(1,2),
               labels = c("female", "male")
  ),
  color = factor(c(3,2,2,1,4,4,5),
                levels= c(1,2,3,4,5),
                labels= c("red", "green", "blue", "yellow", "brown")
  )
)

# Make a reference table
data.frame(level = seq_along(levels(test$color)),
           label = levels(test$color))

  level  label
1     1    red
2     2  green
3     3   blue
4     4 yellow
5     5  brown

如果要获取数据框中所有因素的引用,可以对代码进行向量化:

factor_reference <- function(data)
{
  Ref <- 
    lapply(data,
           function(x)
           {
             if (is.factor(x)) data.frame(level = seq_along(levels(x)),
                                          label = levels(x))
             else NULL
           }
    )

  Ref[!vapply(Ref, is.null, logical(1))]
}

factor_reference(test)
$sex
  level  label
1     1 female
2     2   male

$color
  level  label
1     1    red
2     2  green
3     3   blue
4     4 yellow
5     5  brown