如何对每个 ID 一行和多个虚拟对象 == 1 进行虚拟化?

问题描述 投票:0回答:2

我一直在从事与变量虚拟化相关的工作,但我一直无法获得我正在寻找的结果。我确信一定有一个简单的解决方案,但无法找到它。

我的数据集如下所示:

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 中输入每个参数,每个虚拟一个(原始变量的级别)。如果有数百个级别怎么办?

r dplyr dummy-variable
2个回答
1
投票

您可以使用

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")

0
投票

使用

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")
© www.soinside.com 2019 - 2024. All rights reserved.