[英]Assistance with reshaping intensive longitudinal data in R
如果我沒有正確發布,請見諒。 我是 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 = 第 4 天,時間 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 是參與者在特定日期、特定時間對給定調查項目的響應。
任何幫助將非常感激!
干杯
Ronak 的答案完美無缺,但不需要使用extract
: pivot_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))
這是使用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
我們也可以使用與names_pattern
中的pivot_longer
相同的模式使用extract
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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.