使用键将数字列转换为具有不同标签的因子
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
中您需要使用的参数的名称。这使您可以使用已知级别和标签信息轻松使用 purrr 到 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 的向量。
我有一个包含 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
.
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
中您需要使用的参数的名称。这使您可以使用已知级别和标签信息轻松使用 purrr 到 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 的向量。