【问题标题】:Reshaping longitudinal value to wide, for data with multiple rows per subject对于每个主题多行的数据,将纵向值重塑为宽值
【发布时间】:2019-06-13 15:26:07
【问题描述】:

R:将数据从长变宽,包括日期

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

我有一个关于重塑纵向数据的问题。诀窍是每个主题有多行('row_num' 范围从 1 到 8)。

我查看了 20 多个 Stack Overflow 页面、其他一些页面以及 Hadley 的关于重塑的帖子(和文章),似乎找不到我找不到的差距:

每个主题都有多行,但不知道如何将其变成一行。诀窍是我需要回答(比如说)Q1、...、Q5,并将其变成两个或更多问题(Q1.1、...、Q5.1、Q1 .2,...Q5.2,...)

使用一个术语,'row_num' 是一个 within-subject 变量,一切似乎都基于 between-subject 变量。

这让我感到困惑和沮丧,因为恕我直言,经典的纵向到广泛的情况 = 每个主题多行(带有一个变量块)到每个主题一行(带有多个变量块)。

有人可以指导我找到一些涵盖此内容的答案或教程吗?

非常感谢!

编辑后,原始数据框的 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

【问题讨论】:

  • 没有样本数据很难理解你在问什么,但你想要的可能不是重塑,而是分组? (因为你说'我每个主题有多行,但不知道如何将其变成一行。')
  • 这听起来像是一条检查路径。我去看看!

标签: r date group-by grouping reshape


【解决方案1】:

如果您提供一些示例数据,我们可以提供帮助。网络上充满了使用以下功能的教程:

gather()spread() 来自 tidyr

melt()dcast() 来自 reshape2

【讨论】:

  • 当然!我正在尝试弄清楚如何以一种不会出现格式混乱的方式发布数据。
  • 这样好吗?结构(列表(Subject_ID = c(1, 1, 1, 2, 3, 3), row_num = c(1, 2, 3, 1, 1, 2), 日期 = 结构(c(17897, 17898, 17899, 17869, 17880, 17891), class= "日期"), Q1 = c(4, 1, 2, NA, 3, 1), Q2_text = c("因为", "O, 麻烦", NA, NA, "此外", NA), Q3 = c(5, 5, 3, 1, 5, 4), Q4 = c(5, 4, 4, 4, NA, 3), Q5 = c(1, 1, NA , 1, 3, 2), Q6_text = c("等等", NA, NA, NA, NA, "结论")), class= c("spec_tbl_df", "tbl_df", "tbl", "数据.frame")
  • 如果可以的话,对你的数据使用dput()
  • 我重新阅读了示例并将打印 dput() 命令的结果添加到原始问题中。顺便说一句,我已经倾注了 reshape2 包,以及关于 reshape(和 reshape2)包的大量教程。反复打击我的是这些例子似乎不适合我正在尝试做的事情(这让我很惊讶!)。它们真的归结为每一行都保持为一排(在熔化和重铸之后。我需要将多行组合成一行,一行中的每组测量值在新行中形成一组测量值。
【解决方案2】:

这是一种使用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>

【讨论】:

    猜你喜欢
    • 2020-05-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多