使用键将数字列转换为具有不同标签的因子

Convert numeric columns to factors with different labels using key

我有一个包含 900 列数值数据的数据集,我需要将数值列转换为具有标签的因子。许多标签会重复。我正在尝试编写一个函数来获取数字列,确定该列需要的标签类型,然后应用该标签。

这是一个示例数据框:

#create data frame with columns a,b,c,d
a<-c(1,2,3,4,5)
b<-c(0,1,0,1,0)
c<-c(1,0,1,0,1)
d<-c(2,3,4,5,3)

x<-as.data.frame(cbind(a,b,c,d))

我有一个单独的数据框(即 y),其中包含一个键(即 e 列),该键标识应将哪些因素标签应用于哪些列(即 f 列)。请注意 b 和 c 应该具有相同的标签。

e<-c(1,2,2,3)
f<-c("a","b","c","d")

y<-as.data.frame(cbind(e,f))

我想编写一个函数来执行以下但自动化的操作。以下是我想应用于 a、b、c、d 的示例标签——其中 a 和 d 不同,但 b 和 c 相同。

x$a<-factor(x$a,
    levels=c(1,2,3,4,5),
    labels=c("Less than 25%",
    "25-50%",
    "51-75%",
    "76-90%",
    "More than 90%"))

x$b<-factor(x$b,
    levels=c(0,1),
    labels=c("Yes","No"))

x$c<-factor(x$c,
    levels=c(0,1),
    labels=c("Yes","No"))

x$d<-factor(x$c,
    levels=c(1,2,3,4,5),
    labels=c("l","m","n","o","p"))

最终数据集如下所示:

>x
              a   b   c d
1 Less than 25% Yes  No m
2        25-50%  No Yes n
3        51-75% Yes  No o
4        76-90%  No Yes p
5 More than 90% Yes  No n

在实际数据集中,会有接近60个标签。

如果您可以获得与 e 列适当关联的标签和级别,即您对数据集列的 link,则可以通过 purrr:pmap_df 执行此操作。

这是它的样子。大部分工作是将标签和级别作为列表列获取,这是我通过 tibble(使用 dplyr 加载)完成的。

从您的第二个数据集开始,y,这是其中的重要部分。

e = c(1,2,2,3)
f =  names(x)

y = data.frame(e,f)

  e f
1 1 a
2 2 b
3 2 c
4 3 d

确保级别和标签可用并且可以与您的 e 矢量相关联。如果它们是长格式,您可以通过 tidyr::nest 将它们转换为列表列格式。我发现这是写出此信息最耗时的步骤。

library(dplyr)

levels.labels = tibble(e = c(1, 2, 3),
             levels = list(1:5, 0:1, 1:5),
             labels = list(c("Less than 25%",
                             "25-50%",
                             "51-75%",
                             "76-90%",
                             "More than 90%"),
                           c("Yes","No"),
                           c("l","m","n","o","p")))

如果您需要在 R 中编写关卡和标签,您可能想尝试 tribble,它在 tibble 包的开发版本中可用。

library(tibble)
levels.labels  = tribble(~e, ~levels, ~labels,
      1, 1:5, c("Less than 25%",
               "25-50%",
               "51-75%",
               "76-90%",
               "More than 90%"),
      2, 0:1, c("Yes","No"),
      3, 1:5, c("l","m","n","o","p"))

根据 e 将级别和标签与您的 y 数据集合并。结果的行是 x.

的列的 1 对 1 匹配
key = left_join(y, levels.labels)

  e f        levels                                               labels
1 1 a 1, 2, 3, 4, 5 Less than 25%, 25-50%, 51-75%, 76-90%, More than 90%
2 2 b          0, 1                                              Yes, No
3 2 c          0, 1                                              Yes, No
4 3 d 1, 2, 3, 4, 5                                        l, m, n, o, p

要因式分解每一列,请将 x 数据集、水平和标签全部放入一个命名列表中。每个元素的名称对应于 factor 中您需要使用的参数的名称。这使您可以使用已知级别和标签信息轻松使用 purrrfactor x 的每一列。

library(purrr)
pmap_df(list(x = x, levels = key$levels, labels = key$labels), factor)

# A tibble: 5 x 4
              a      b      c      d
         <fctr> <fctr> <fctr> <fctr>
1 Less than 25%    Yes     No      m
2        25-50%     No    Yes      n
3        51-75%    Yes     No      o
4        76-90%     No    Yes      p
5 More than 90%    Yes     No      n

pmap函数中,列表中的元素必须大小相同。在本例中,第一个元素有 4 列,后两个元素是长度为 4 的向量。