使用Pivot_Wide()扩展多个变量(&Q) [英] "spread" multiple variables using pivot_wider()

查看:0
本文介绍了使用Pivot_Wide()扩展多个变量(&Q)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

tidyr的开发版本中使用pivot_wider()"分散"多个变量的最佳方式是什么?

# https://tidyr.tidyverse.org/dev/reference/pivot_wider.html
# devtools::install_github("tidyverse/tidyr")
library(tidyr)
library(tidyverse)
have <- tibble::tribble(
  ~user_id, ~question, ~answer, ~timestamp,
  1, "q1", "a1", "2019-07-22 16:54:43",
  1, "q2", "a2", "2019-07-22 16:55:43",
  2, "q1", "a1", "2019-07-22 16:56:43",
  2, "q2", "a2", "2019-07-22 16:57:43",
  3, "q1", "a1", "2019-07-22 16:58:43",
  3, "q2", "a2", "2019-07-22 16:59:43"
) %>%
  mutate(timestamp = as_datetime(timestamp))

have
# # A tibble: 6 x 4
# user_id question answer timestamp          
# <dbl> <chr>    <chr>  <dttm>             
#   1       1 q1       a1     2019-07-22 16:54:43
#   2       1 q2       a2     2019-07-22 16:55:43
#   3       2 q1       a1     2019-07-22 16:56:43
#   4       2 q2       a2     2019-07-22 16:57:43
#   5       3 q1       a1     2019-07-22 16:58:43
#   6       3 q2       a2     2019-07-22 16:59:43

want <- tibble::tribble(
    ~user_id, ~q1, ~q2, ~timestamp_q1, ~timestamp_q2,
    1, "a1", "a2", "2019-07-22 16:54:43", "2019-07-22 16:55:43",
    2, "a1", "a2", "2019-07-22 16:56:43", "2019-07-22 16:57:43",
    3, "a1", "a2", "2019-07-22 16:58:43", "2019-07-22 16:59:43"
  ) %>%
  mutate(timestamp_q1 = as_datetime(timestamp_q1)) %>%
  mutate(timestamp_q2 = as_datetime(timestamp_q2))

want
# A tibble: 3 x 5
#  user_id q1    q2    timestamp_q1        timestamp_q2       
#    <dbl> <chr> <chr> <dttm>              <dttm>             
#1       1 a1    a2    2019-07-22 16:54:43 2019-07-22 16:55:43
#2       2 a1    a2    2019-07-22 16:56:43 2019-07-22 16:57:43
#3       3 a1    a2    2019-07-22 16:58:43 2019-07-22 16:59:43

如果要分布一对变量,则此方法有效,但失败,因为只应将user_id作为标识变量。

have %>%
  pivot_wider(names_from = question, values_from = answer)

# # A tibble: 6 x 4
# user_id timestamp           q1    q2   
# <dbl> <dttm>              <chr> <chr>
#   1       1 2019-07-22 16:54:43 a1    NA   
#   2       1 2019-07-22 16:55:43 NA    a2   
#   3       2 2019-07-22 16:56:43 a1    NA   
#   4       2 2019-07-22 16:57:43 NA    a2   
#   5       3 2019-07-22 16:58:43 a1    NA   
#   6       3 2019-07-22 16:59:43 NA    a2   

推荐答案

您可以在values_from参数中包含多个列,以便一次展开多个列:

have %>%
    pivot_wider(
        id_cols = user_id,
        names_from = question,
        values_from = c(answer, timestamp)
    ) %>%
    # remove the 'answer_' prefix from those cols
    rename_all(~ str_remove(., "answer_"))

输出:

# A tibble: 3 x 5
  user_id q1    q2    timestamp_q1        timestamp_q2       
    <dbl> <chr> <chr> <dttm>              <dttm>             
1       1 a1    a2    2019-07-22 16:54:43 2019-07-22 16:55:43
2       2 a1    a2    2019-07-22 16:56:43 2019-07-22 16:57:43
3       3 a1    a2    2019-07-22 16:58:43 2019-07-22 16:59:43

这篇关于使用Pivot_Wide()扩展多个变量(&Q)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆