代码之家  ›  专栏  ›  技术社区  ›  Economist_Ayahuasca

在R中重塑复杂的数据集

  •  1
  • Economist_Ayahuasca  · 技术社区  · 6 年前

    我有一个奇怪的数据集格式,简单的重塑函数无法工作。假设我有三个时间段(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 回复  |  直到 3 年前
        1
  •  1
  •   Nimantha Dave Sherohman    3 年前
    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))
    
        2
  •  1
  •   hpesoj626    6 年前

    这是另一个 dplyr tidyr 解决方案

    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