首页 > 解决方案 > pivot_wider 基于 0 或 1 的条件

问题描述

我正在尝试使用pivot_wider 我的数据。数据如下:

       dates yes_no
1 2017-01-01      0
2 2017-01-02      1
3 2017-01-03      0
4 2017-01-04      1
5 2017-01-05      1

我试图让预期的输出是:

       dates yes_no 2017-01-02_1   2017-01-04_1     2017-01-05_1  
1 2017-01-01      0      0            0                 0
2 2017-01-02      1      1            0                 0
3 2017-01-03      0      0            0                 0
4 2017-01-04      1      0            1                 0 
5 2017-01-05      1      0            0                 1

spreadyes_no列有 1 英寸时,数据所在的位置。

这对我不起作用:

d %>% 
  mutate(value_for_one_hot = 1) %>%
  pivot_wider(names_from = dates, values_from = value_for_one_hot,
            names_prefix = "date_", values_fill = list(value_for_one_hot = 0)) 

数据:

data.frame(
  dates = c("2017-01-01", "2017-01-02", "2017-01-03", "2017-01-04", "2017-01-05"),
  yes_no = c(0, 1, 0, 1, 1) 
)

标签: rtidyr

解决方案


这是一种方法,它实际上并没有重塑数据。

library(data.table)
setDT(d)

ind <- d[['yes_no']] != 0
cols <- as.character(d[['dates']])[ind]

d[, (cols) := 0L]
d[ind, (cols) := as.data.frame(diag(.N))]

## also valid
# set(d, which(ind), cols, as.data.frame(diag(length(cols))))

d

推荐阅读