我一直在从事与变量虚拟化相关的工作,但我一直无法获得我正在寻找的结果。我确信一定有一个简单的解决方案,但无法找到它。
我的数据集如下所示:
TM_ID | APPLICATION_YEAR | 过期 | 持续时间 | 不错 |
---|---|---|---|---|
5 | 1870 | 1902 | 32 | 第 34 类 |
6 | 1870 | 1891 | 21 | 第 32 类 |
19 | 1902 | 1943 | 41 | 第 34 类 |
19 | 1902 | 1943 | 41 | 第 16 类 |
20 | 1876 | 1881 | 5 | 第 34 类 |
21 | 1876 | 1877 | 12 | 第 34 类 |
70 | 1877 | 1902 | 25 | 第 16 类 |
70 | 1877 | 1902 | 25 | 第 34 类 |
我想对 NICE 列进行虚拟化以获得每个 TM_ID 一行以及代表 NICE 列中每个级别的列。
我尝试使用 dummyVars();它为每个级别创建了一个虚拟对象,但每个 TM_ID 仍然有多个观察值。我也尝试过使用 dcast() 或pivot_wider(),但我无法实现我所需要的。它应该看起来像这样:
TM_ID | APPLICATION_YEAR | 过期 | 持续时间 | 第 16 类 | 第 32 类 | 第 34 类 |
---|---|---|---|---|---|---|
5 | 1870 | 1902 | 32 | 0 | 0 | 1 |
6 | 1870 | 1891 | 21 | 0 | 1 | 0 |
19 | 1902 | 1943 | 41 | 1 | 0 | 1 |
20 | 1876 | 1881 | 5 | 0 | 0 | 1 |
21 | 1876 | 1877 | 12 | 0 | 0 | 1 |
70 | 1877 | 1902 | 25 | 1 | 0 | 1 |
NICE 级别的每个相应列中每个 ID 和 1 是否只有一个观察结果。
我发现做到这一点的唯一方法是首先使用 dummyVars() 进行单热编码,然后使用 group_by() 和 mutate(),例如:
group_by(TM_ID) %>%
mutate(NICE_1 = sum(NICE.1), NICE_10 = sum(NICE.10), NICE_11 = sum(NICE.11)......
但是这个解决方案的问题是我必须在 mutate 中输入每个参数,每个虚拟一个(原始变量的级别)。如果有数百个级别怎么办?
您可以使用
pivot_wider
获取宽格式的数据,并使用 values_fn = length
虚拟化 NICE
列。
library(dplyr)
library(tidyr)
res <- df %>%
arrange(NICE) %>%
pivot_wider(names_from = NICE, values_from = NICE,
values_fn = length, values_fill = 0)
res
# TM_ID APPLICATION_YEAR EXPIRATION DURATION `CLASE 16` `CLASE 32` `CLASE 34`
# <int> <int> <int> <int> <int> <int> <int>
#1 19 1902 1943 41 1 0 1
#2 70 1877 1902 25 1 0 1
#3 6 1870 1891 21 0 1 0
#4 5 1870 1902 32 0 0 1
#5 20 1876 1881 5 0 0 1
#6 21 1876 1877 12 0 0 1
数据
df <- structure(list(TM_ID = c(5L, 6L, 19L, 19L, 20L, 21L, 70L, 70L
), APPLICATION_YEAR = c(1870L, 1870L, 1902L, 1902L, 1876L, 1876L,
1877L, 1877L), EXPIRATION = c(1902L, 1891L, 1943L, 1943L, 1881L,
1877L, 1902L, 1902L), DURATION = c(32L, 21L, 41L, 41L, 5L, 12L,
25L, 25L), NICE = c("CLASE 34", "CLASE 32", "CLASE 34", "CLASE 16",
"CLASE 34", "CLASE 34", "CLASE 16", "CLASE 34")), row.names = c(NA,
-8L), class = "data.frame")
使用
data.table
library(data.table)
dcast(setDT(df)[order(NICE)], ... ~ NICE, value.var = 'NICE', length)
TM_ID APPLICATION_YEAR EXPIRATION DURATION CLASE 16 CLASE 32 CLASE 34
1: 5 1870 1902 32 0 0 1
2: 6 1870 1891 21 0 1 0
3: 19 1902 1943 41 1 0 1
4: 20 1876 1881 5 0 0 1
5: 21 1876 1877 12 0 0 1
6: 70 1877 1902 25 1 0 1
df <- structure(list(TM_ID = c(5L, 6L, 19L, 19L, 20L, 21L, 70L, 70L
), APPLICATION_YEAR = c(1870L, 1870L, 1902L, 1902L, 1876L, 1876L,
1877L, 1877L), EXPIRATION = c(1902L, 1891L, 1943L, 1943L, 1881L,
1877L, 1902L, 1902L), DURATION = c(32L, 21L, 41L, 41L, 5L, 12L,
25L, 25L), NICE = c("CLASE 34", "CLASE 32", "CLASE 34", "CLASE 16",
"CLASE 34", "CLASE 34", "CLASE 16", "CLASE 34")), row.names = c(NA,
-8L), class = "data.frame")