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

时间:2019-01-19 17:31:53

标签: r date group-by grouping reshape

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

(我试图添加数据,但格式是如此可怕,以至于我放弃了。)

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

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

我每个科目都有多行,而且找不到如何将其变成一行。诀窍是,我需要(假设)Q1,...,Q5,并将其变成两个或更多的 blocks 问题(Q1.1,...,Q5.1,Q1 .2,... Q5.2,...)

使用一种术语,'row_num'是一个主题内变量,并且所有内容似乎都基于 subject-subject 变量。

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

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

非常感谢您!

在编辑后,原始数据帧的内容如下所示:

# 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 个答案:

答案 0 :(得分:0)

如果您提供了一些示例数据,我们将为您提供帮助。网络上充斥着使用以下功能来完成您感兴趣的功能的教程:

gather()spread()来自tidyr软件包

melt()dcast()来自reshape2软件包

答案 1 :(得分:0)

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