我有一个包含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个标签。
答案 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_df
到factor
的每个列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的向量。