代码之家  ›  专栏  ›  技术社区  ›  Barry DeCicco

将纵向值重塑为宽,用于每个主题有多行的数据

  •  -4
  • Barry DeCicco  · 技术社区  · 7 年前

    R: 从长到宽重塑数据,包括日期

    (我试图包含数据,但格式太糟糕了,我放弃了)。

    我有一个关于重塑纵向数据的问题。诀窍是每个主题有多行(“row\u num”的范围从1到8)。

    我查看了20多个堆栈溢出页面,一些其他页面,以及Hadley关于重塑的帖子(和文章),似乎有一个空白我找不到:

    阻碍 问题(问题1,…,问题5.1,问题1.2,…,问题5.2,…)

    使用一个术语,“row\u num”是 一切似乎都是基于 学科间 变量。

    这让我感到困惑和沮丧,因为经典的纵向到横向的情形=每个主题多行(有一个变量块)到每个主题一行(有多个变量块)。

    有人能告诉我一些答案或教程,可以涵盖这一点吗?

    非常感谢你!

    编辑时,原始数据帧的dput如下所示:

    # A tibble: 6 x 9
      Subject_ID row_num Date          Q1 Q2_text       Q3    Q4    Q5 Q6_text      
           <dbl>   <dbl> <date>     <dbl> <chr>      <dbl> <dbl> <dbl> <chr>        
    1          1       1 2019-01-01     4 Because        5     5     1 and so on    
    2          1       2 2019-01-02     1 O, bother      5     4     1 NA           
    3          1       3 2019-01-03     2 NA             3     4    NA NA           
    4          2       1 2018-12-04    NA NA             1     4     1 NA           
    5          3       1 2018-12-15     3 In addtion     5    NA     3 NA           
    6          3       2 2018-12-26     1 NA             4     3     2 in conclusion
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   Claudiu Papasteri    7 年前

    如果你能提供一些样本数据,我们可以帮你。网站上有很多教程,介绍如何使用以下功能来做您感兴趣的事情:

    gather() 和 spread() tidyr 包裹

    melt() 和 dcast() 从 reshape2 包裹

        2
  •  0
  •   Jon Spring    7 年前

    这里有一种方法 tidyr .

    library(tidyr)
    df2 <- df %>%
      # (optional) First convert all the data columns to text so 
      #   they're readable throughout the process.
      mutate_at(vars(Date:Q6_text), as.character) %>%
    
      # Gather into long format, where we record the column it came from 
      #   as "question" and the value it held as "value"
      gather(question, value, -Subject_ID, -row_num) %>%
    
      # Combine the row_num and question into a new column
      unite("question2", c("row_num", "question")) %>%
    
      # Use that new column to spread everything out
      spread(question2, value)
    
    
    > df2
      Subject_ID     1_Date 1_Q1  1_Q2_text 1_Q3 1_Q4 1_Q5 1_Q6_text     2_Date 2_Q1 2_Q2_text 2_Q3 2_Q4 2_Q5     2_Q6_text     3_Date 3_Q1 3_Q2_text 3_Q3 3_Q4 3_Q5 3_Q6_text
    1          1 2019-01-01    4    Because    5    5    1 and so on 2019-01-02    1 O, bother    5    4    1          <NA> 2019-01-03    2      <NA>    3    4 <NA>      <NA>
    2          2 2018-12-04 <NA>       <NA>    1    4    1      <NA>       <NA> <NA>      <NA> <NA> <NA> <NA>          <NA>       <NA> <NA>      <NA> <NA> <NA> <NA>      <NA>
    3          3 2018-12-15    3 In addtion    5 <NA>    3      <NA> 2018-12-26    1      <NA>    4    3    2 in conclusion       <NA> <NA>      <NA> <NA> <NA> <NA>      <NA>