将纵向值调整为宽,适用于每个主题具有多行的数据

Reshaping longitudinal value to wide, for data with multiple rows per subject

提问人:Barry DeCicco 提问时间:1/20/2019 最后编辑:Jon SpringBarry DeCicco 更新时间:1/20/2019 访问量:345

问:

R:将数据从长到宽重新调整,包括日期

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

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

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

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

使用一个术语,“row_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
r 日期 组依据分 组重塑

评论

0赞 anotherfred 1/20/2019
如果没有样本数据,就很难理解你在问什么,但你想要的可能不是重塑,而是分组?(因为你说“我每个主题有多行,但不知道如何把它变成一行。
0赞 Barry DeCicco 1/20/2019
这听起来像是一条需要检查的路径。我会检查的!

答:

0赞 Claudiu Papasteri 1/20/2019 #1

如果您提供一些示例数据,我们可以提供帮助。网络上有很多教程,用于使用以下函数来执行您感兴趣的功能:

gather()并从包装中spread()tidyr

melt()并从包装中dcast()reshape2

评论

0赞 Barry DeCicco 1/20/2019
当然!我正在尝试弄清楚如何以一种不会有混乱格式的方式发布数据。
0赞 Barry DeCicco 1/20/2019
这样好吗?structure(list(Subject_ID = c(1, 1, 1, 2, 3, 3), row_num = c(1, 2, 3, 1, 1, 2), Date = structure(c(17897, 17898, 17899, 17869, 17880, 17891), class = “Date”), 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”, “data.frame”)
0赞 Claudiu Papasteri 1/20/2019
如果可以,请对您的数据使用。dput()
0赞 Barry DeCicco 1/20/2019
我重新阅读了该示例,并将打印 dput() 命令的结果添加到原始问题中。顺便说一句,我已经倾注了 reshape2 包,以及大量关于 reshape(和 reshape2)包的教程。反复打击我的是,这些例子似乎不适合我想要做的事情(这让我感到非常惊讶!它们真的归结为每一行都保持为一排(在熔化和重铸之后。我需要将多行合并为一行,一行中的每组测量值在新行中形成一个测量值块。
0赞 Jon Spring 1/20/2019 #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>