【问题标题】:Assistance with reshaping intensive longitudinal data in R协助重塑 R 中的密集纵向数据
【发布时间】:2020-01-08 06:27:38
【问题描述】:

抱歉,如果我没有正确发布。我是 R 新手,这是我在 stackoverflow 上的第一篇文章。我已经尽可能多地阅读以找到解决我的问题的方法,但找不到我可以使用的东西。

我正在尝试重塑一些密集的纵向数据。目前它是宽格式,看起来像这样:

Participant   D1_1_1   D1_1_2   D1_1_3   D1_1_4    D2_1_1   D2_1_2  etc...
P1               6        2        3        5        1         2
P2               4        9        3        6        4         1
P3               7        4        2        8        1         1
P4               1        5        1        1        6         7 
P5               2        0        8        2        1         4
etc..

列变量是指对特定调查项目的响应,在特定日期,在一天中的特定时间进行。

所以:

D1_1_1 = 第 1 天,第 1 时间,第 1 项

D1_1_2 = 第 1 天,第 1 时间,第 2 项

...

D4_3_7 = 第四天,时间 3,项目 7

总的来说,我拥有的数据包括: 60 名参与者对 11 个项目做出了回应,每天 4 次,持续 10 天(每个参与者总共 440 个数据点)。

我正在寻求帮助,以便能够有效地将其转换为长格式,因此它可能看起来像这样:

Participant     Day     time    item 1   item 2 ... item 11
P1               1        1        6        2
P1               1        2        X        X
P1               1        3        X        X
P1               1        4        X        X
P1               2        1        1        4
etc..

其中 X 是参与者在特定日期、特定时间对给定调查项目的反应。

任何帮助将不胜感激!

干杯

【问题讨论】:

    标签: r reshape longitudinal


    【解决方案1】:

    Ronak 的答案完美无缺,但没有必要使用 extractpivot_longer 已经可以将列分成几个:

    library(tidyr)
    
    df %>%
      pivot_longer(cols = -Participant, names_to = c("day", "time", "item"), 
                   names_pattern = "(D\\d)_(\\d)_(\\d)") %>%
      pivot_wider(names_from = item, values_from = value, names_prefix = "Item")
    #> # A tibble: 10 x 7
    #>    Participant day   time  Item1 Item2 Item3 Item4
    #>    <fct>       <chr> <chr> <int> <int> <int> <int>
    #>  1 P1          D1    1         6     2     3     5
    #>  2 P1          D2    1         1     2    NA    NA
    #>  3 P2          D1    1         4     9     3     6
    #>  4 P2          D2    1         4     1    NA    NA
    #>  5 P3          D1    1         7     4     2     8
    #>  6 P3          D2    1         1     1    NA    NA
    #>  7 P4          D1    1         1     5     1     1
    #>  8 P4          D2    1         6     7    NA    NA
    #>  9 P5          D1    1         2     0     8     2
    #> 10 P5          D2    1         1     4    NA    NA
    

    数据:

    df <- structure(list(Participant = structure(1:5, .Label = c("P1", 
    "P2", "P3", "P4", "P5"), class = "factor"), D1_1_1 = c(6L, 4L, 
    7L, 1L, 2L), D1_1_2 = c(2L, 9L, 4L, 5L, 0L), D1_1_3 = c(3L, 3L, 
    2L, 1L, 8L), D1_1_4 = c(5L, 6L, 8L, 1L, 2L), D2_1_1 = c(1L, 4L, 
    1L, 6L, 1L), D2_1_2 = c(2L, 1L, 1L, 7L, 4L)), class = "data.frame", 
    row.names = c(NA, -5L))
    

    【讨论】:

    • 谢谢您,先生。我在让它工作时遇到了一些麻烦,但最终它做到了。我认为 \\d 部分仅适用于数字 0-9,因此它没有捕获项目 10 和 11。我将它们更改为字母 X 和 Y,并改用 //w ——这似乎对我有用。谢谢你帮助我:) 非常感谢
    【解决方案2】:

    这是pivot_longer + pivot_wider 的一种方式

    library(dplyr)
    library(tidyr)
    
    pivot_longer(df, cols = -Participant, names_to = c("Day", "Time", "Item"), 
                     names_pattern = "D(\\d+)_(\\d+)_(\\d+)") %>%
        mutate(Item = paste0("Item",Item)) %>%
        pivot_wider(names_from = Item, values_from = value)
    
    # A tibble: 10 x 7
    #   Participant Day   Time  Item1 Item2 Item3 Item4
    #   <fct>       <chr> <chr> <int> <int> <int> <int>
    # 1 P1          1     1         6     2     3     5
    # 2 P1          2     1         1     2    NA    NA
    # 3 P2          1     1         4     9     3     6
    # 4 P2          2     1         4     1    NA    NA
    # 5 P3          1     1         7     4     2     8
    # 6 P3          2     1         1     1    NA    NA
    # 7 P4          1     1         1     5     1     1
    # 8 P4          2     1         6     7    NA    NA
    # 9 P5          1     1         2     0     8     2
    #10 P5          2     1         1     4    NA    NA
    

    我们也可以使用extract,使用与pivot_longer中的names_pattern相同的模式

    pivot_longer(df, cols = -Participant) %>%
         extract(name, into = c("Day", "Time", "Item"), 
                 regex = "D(\\d+)_(\\d+)_(\\d+)") %>%
         pivot_wider(names_from = Item, values_from = value)
    

    数据

    df <- structure(list(Participant = structure(1:5, .Label = c("P1", 
    "P2", "P3", "P4", "P5"), class = "factor"), D1_1_1 = c(6L, 4L, 
    7L, 1L, 2L), D1_1_2 = c(2L, 9L, 4L, 5L, 0L), D1_1_3 = c(3L, 3L, 
    2L, 1L, 8L), D1_1_4 = c(5L, 6L, 8L, 1L, 2L), D2_1_1 = c(1L, 4L, 
    1L, 6L, 1L), D2_1_2 = c(2L, 1L, 1L, 7L, 4L)), class = "data.frame", 
    row.names = c(NA, -5L))
    

    【讨论】:

      猜你喜欢
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多