R使用重塑将数据从宽传输到长

  • 本文关键字:传输 数据 r reshape
  • 更新时间 :
  • 英文 :


我的数据包含三个时间点的测量。有两组(安慰剂组和治疗组),每组分配一个ID。数据看起来像

Group      ID          Time1         Time2        Time3
1           1          33             44           77
1           2          24             123          54
1           3          32             343          434
1           4          23             23           22
2           5          14             13           24
2           6          67             14           33
2           7          55             34           35
2           6          33             12           11

期望的输出应该是:

Group     ID    Measurement
1         1     33
1         1     44
1         1     77
1         2     24
1         2     123
1         2     54

等等

我如何使用重塑函数转移到长形式?谢谢你。

这是一个基本的Rreshape解决方案。

vars <- grep("^Time", names(df1), value = TRUE)
Times <- as.integer(sub("[^[:digit:]]*", "", vars))
df1$row.number <- seq_len(nrow(df1))
df2 <- reshape(df1, 
varying = list(vars), 
v.names = "Time",
idvar = c("row.number", "ID", "Group"), 
times = Times,
timevar = "Time",
direction = "long")
df2$row.number <- NULL
row.names(df2) <- NULL
head(df2)
#  Group ID Time
#1     1  1   33
#2     1  2   24
#3     1  3   32
#4     1  4   23
#5     2  5   14
#6     2  6   67

df1 <- read.table(text = "
Group      ID          Time1         Time2        Time3
1           1          33             44           77
1           2          24             123          54
1           3          32             343          434
1           4          23             23           22
2           5          14             13           24
2           6          67             14           33
2           7          55             34           35
2           6          33             12           11
", header = TRUE)

使用reshape函数,您可以尝试如下:

reshape(df, 
direction = "long",
varying = c("Time1", "Time2", "Time3"),
v.names = "Meassurement",
idvar = c("Group", "ID"),
timevar = "Time",
new.row.names= as.character(1:(nrow(df)*3)))
Group ID Time Meassurement
1      1  1    1           33
2      1  2    1           24
3      1  3    1           32
4      1  4    1           23
5      2  5    1           14
6      2  6    1           67
7      2  7    1           55
8      2  8    1           33

这是tidyversepivot_longer的方式:

df %>% 
pivot_longer(cols = contains("Time"),
names_to = "Time",
values_to = "Measurement")
# A tibble: 24 x 4
Group    ID Time  Measurement
<int> <int> <chr>       <int>
1     1     1 Time1          33
2     1     1 Time2          44
3     1     1 Time3          77
4     1     2 Time1          24
5     1     2 Time2         123
6     1     2 Time3          54
7     1     3 Time1          32
8     1     3 Time2         343
9     1     3 Time3         434
10     1     4 Time1          23
# ... with 14 more rows

最新更新