我的数据包含三个时间点的测量。有两组(安慰剂组和治疗组),每组分配一个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
这是tidyverse
与pivot_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