首页 > 解决方案 > 当没有名称列时(或应创建名称列时)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)

我想转换dfdf2.

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)

标签: rdplyrtidyversetidyr

解决方案


我们可以创建一个新的 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')

推荐阅读