【问题标题】:pivot_wider when there's no names column (or when names column should be created)当没有名称列时(或应创建名称列时)pivot_wider
【发布时间】:2020-08-27 17:39:09
【问题描述】:

我正在尝试将我的数据从长到宽重塑,但在这里我需要创建名称列,例如 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)

【问题讨论】:

  • val 列发生了什么?你不希望它出现在输出中?
  • @alistaire 是的,至少对于这个练习,该列对于过滤步骤是必需的。
  • 此问题的重复标记不正确,请删除

标签: r dplyr tidyverse tidyr


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    对于基础 R 爱好者:

    df$time <- sequence(rle(df$id)$lengths)
    reshape(df, direction="wide", v.names="date")
    
    #  id       val     date.1     date.2     date.3
    #1  1 0.6225360 2009-01-03 2009-01-04       <NA>
    #3  2 1.6256636 2009-01-06 2009-01-07       <NA>
    #5  3 0.9514475 2009-01-10 2009-01-11 2009-01-12
    

    注意val来自每个id组的第一条记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      相关资源
      最近更新 更多