在 R 中重塑复杂的数据集

Reshaping complicating data-set in R

我有一种奇怪的数据集格式,其中简单的重塑函数不起作用。假设我有三个时间段(1-3); 2 个 id 名称 (A-B);以及以下格式的三个变量(X、Y 和 Z)。其中 id 名称和变量名称由 -:

分隔
Time A-X A-Y A-Z B-X B-Y B-Z
1    2   4   5   6   1   2
2    2   3   2   3   2   3
3    4   4   4   4   4   4

理想情况下,我想生成以下格式的数据集:

ID Time X Y Z
A  1    2 4 5  
A  2    2 3 2
A  3    4 4 4
B  1    6 1 2
B  2    3 2 3
B  3    4 4 4

要使用哪些功能?

library(dplyr)
library(tidyr)
library(splitstackshape)

df %>%
  gather(key, value, -Time) %>%
  cSplit("key", sep="_") %>%
  spread(key_2, value) %>%
  rename(ID = key_1) %>%
  arrange(ID, Time)

输出为:

  Time ID X Y Z
1    1  A 2 4 5
2    2  A 2 3 2
3    3  A 4 4 4
4    1  B 6 1 2
5    2  B 3 2 3
6    3  B 4 4 4

示例数据:

df <- structure(list(Time = 1:3, A_X = c(2L, 2L, 4L), A_Y = c(4L, 3L, 
4L), A_Z = c(5L, 2L, 4L), B_X = c(6L, 3L, 4L), B_Y = c(1L, 2L, 
4L), B_Z = 2:4), .Names = c("Time", "A_X", "A_Y", "A_Z", "B_X", 
"B_Y", "B_Z"), class = "data.frame", row.names = c(NA, -3L))

这是另一个 dplyrtidyr 解决方案。

df %>%
  gather(ID, value, -Time) %>%
  separate(ID, into = c("ID", "var")) %>%
  spread(var, value) %>%
  arrange(ID) %>%
  select(ID, Time, X, Y, Z)

#   ID Time X Y Z
# 1  A    1 2 4 5
# 2  A    2 2 3 2
# 3  A    3 4 4 4
# 4  B    1 6 1 2
# 5  B    2 3 2 3
# 6  B    3 4 4 4