r - 当没有名称列时(或应创建名称列时)pivot_wider
问题描述
我正在尝试将我的数据从长到宽重塑,但在这里我需要创建名称列,例如 event1、event2、event3 等。换句话说,没有自然的候选names_from
参数。我尝试了几种不同的方法,但无法得到我想要的东西 - 这是一个可重现的例子。
set.seed(57)
df <- data.frame(date = seq.Date(as.Date("2009-01-01"), as.Date("2009-01-12"), by = 1),
id = rep(1:3, each = 4),
val = rnorm(12)) %>% filter(val > 0.5)
我想转换df
为df2
.
df2 <- data.frame(id = c(1:3),
event1 = c("2009-01-03", "2009-01-06", "2009-01-10"),
event2 = c("2009-01-04", "2009-01-07", "2009-01-11"),
event3 = c(" ", " ", "2009-01-12"))
请注意,此数据集记录了每个 id 的第一次、第二次和第三次(如果有)发生日期。
这是我尝试使用names_prefix
但似乎不起作用的方法。
set.seed(57)
df <- data.frame(date = seq.Date(as.Date("2009-01-01"), as.Date("2009-01-12"), by = 1),
id = rep(1:3, each = 4),
val = rnorm(12)) %>% filter(val > 0.5) %>%
pivot_wider(names_prefix = "event", names_from = val, values_from = date)
解决方案
我们可以创建一个新的 id 列,然后使用 pivot_wider
.
library(dplyr)
df %>%
group_by(id) %>%
mutate(row = row_number()) %>%
select(-val) %>%
tidyr::pivot_wider(names_from = row, values_from = date, names_prefix = 'event')
# id event1 event2 event3
# <int> <date> <date> <date>
#1 1 2009-01-03 2009-01-04 NA
#2 2 2009-01-06 2009-01-07 NA
#3 3 2009-01-10 2009-01-11 2009-01-12
使用data.table
:
library(data.table)
dcast(setDT(df), id~rowid(id), value.var = 'date')
推荐阅读
- swift - 枚举Bundle中的sks文件
- java - 从字符串中删除停用词以创建集群
- python - 我可以在 iOS 应用程序中使用用 python 编写的聚类模型吗?
- c# - 如何使用 oracle 在 .net 框架控制台应用程序中创建实体数据模型?
- java - 不能让我的 JButtons 响应。除该面板外的所有内容都调整大小
- c - 编译器如何处理枚举中的符号常量?
- python - 在 Spyder 中创建和运行 Abaqus 几何,而不是打开 Abaqus 命令
- python - 如何在圆的周长上画圆?
- vue.js - 如何在vue js中获取父组件在子组件中的所有道具?
- jenkins - 如何在 ZAP Jenkins 作业中通过 CSRF 令牌验证