r - 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
spread
当yes_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)
)
解决方案
这是一种data.table方法,它实际上并没有重塑数据。
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
推荐阅读
- c# - 在 C# 中反序列化来自 IoT 设备的 Json 消息
- r - 使用另一列的先前值创建一个新列
- javascript - 最接近纯javascript中的试剂光标的东西
- python - Pyshark packet.tcp.analysis_ack_rtt 不始终可用
- plsqldeveloper - 使用 PL/SQL Developer 调试 PL/SQL 集合
- python - For 循环迭代似乎跳过了列表中的两个数字
- flutter - 如何修复制作空白的列并忽略我在颤动中的线性渐变
- docker - Docker:Java 运行时环境内存不足,无法继续
- django - 如何使用 PythonAnywhere SFTP 存储上传的文件以在 Django Filer 中超越文件大小限制?
- python - 有没有办法防止在 python 命令行上自动换行?