使用键

时间:2016-08-19 20:02:33

标签: r if-statement dplyr lapply r-factor

我有一个包含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个标签。

1 个答案:

答案 0 :(得分:1)

如果您可以获得与e列相关联的标签和级别,这是您指向数据集列的链接,则可以通过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"))

根据y将级别和标签与e数据集合并。结果的行是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使用的参数的名称。这样,您就可以使用已知的级别和标签信息,轻松地使用{em> 中的pmap_dffactor的每个列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的向量。