【问题标题】:Reshaping complicating data-set in R在 R 中重塑复杂的数据集
【发布时间】:2018-04-25 10:26:08
【问题描述】:

我有一个奇怪的数据集格式,其中一个简单的重塑功能不起作用。假设我有三个时间段(1-3); 2 个身份证件姓名(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

使用哪些功能?

【问题讨论】:

    标签: r database reshape


    【解决方案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))
    

    【讨论】:

    • 嗨@Prem,如果我们有5个变量,有没有一种简单的方法可以在您的代码中添加一两行。会添加 key_3 和 key_4 吗?
    • 不...这适用于任意数量的列。您可以通过仅执行该步骤的代码来检查每个中间步骤的输出。 (例如检查df %&gt;% gather(key, value, -Time)的输出
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 2017-04-05
      相关资源
      最近更新 更多