重塑R中复杂的数据集

时间:2018-04-25 10:26:08

标签: r database reshape

我有一种奇怪的数据集格式,其中简单的重塑功能不起作用。假设我有三个时间段(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

有关使用哪些功能的建议?

2 个答案:

答案 0 :(得分:1)

希望这有帮助!

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))

答案 1 :(得分:1)

以下是另一个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