我有一些必须处理的格式不正确的数据。它在前两行中包含两个标识符,然后是数据。数据如下:

     V1       V2       V3
1  Date 12/16/18 12/17/18
2 Equip        a        b
3    x1        1        2
4    x2        3        4
5    x3        5        6


我想对数据进行gather使其整洁,但是仅当您具有单个列名称时,收集才有效。我也尝试过传播。我想出的唯一解决方案很骇人,感觉不对。有解决这个问题的优雅方法吗?

这就是我想要的:

      Date Equip metric value
1 12/16/18     a     x1     1
2 12/16/18     a     x2     3
3 12/16/18     a     x3     5
4 12/17/18     b     x1     2
5 12/17/18     b     x2     4
6 12/17/18     b     x3     6


这种方法使我很接近,但是我不知道如何处理格式不正确的问题(没有标题,没有行名)。如果格式正确,gather应该很容易。

> as.data.frame(t(df))
         V1    V2 V3 V4 V5
V1     Date Equip x1 x2 x3
V2 12/16/18     a  1  3  5
V3 12/17/18     b  2  4  6


这是dput

structure(list(V1 = c("Date", "Equip", "x1", "x2", "x3"), V2 = c("12/16/18",
"a", "1", "3", "5"), V3 = c("12/17/18", "b", "2", "4", "6")), class = "data.frame", .Names = c("V1",
"V2", "V3"), row.names = c(NA, -5L))

最佳答案

感谢您发布一个可重复的问题。这是一些温和的tidyr / dplyr按摩。



library(tidyverse)

df <- structure(
    list(
        V1 = c("Date", "Equip", "x1", "x2", "x3"),
        V2 = c("12/16/18", "a", "1", "3", "5"),
        V3 = c("12/17/18", "b", "2", "4", "6")
    ),
    class = "data.frame",
    .Names = c("V1", "V2", "V3"),
    row.names = c(NA, -5L)
)

df %>%
    gather(key = measure, value = value, -V1) %>%
    spread(key = V1, value = value) %>%
    select(-measure) %>%
    gather(key = metric, value = value, x1:x3) %>%
    arrange(Date, Equip, metric)
#>       Date Equip metric value
#> 1 12/16/18     a     x1     1
#> 2 12/16/18     a     x2     3
#> 3 12/16/18     a     x3     5
#> 4 12/17/18     b     x1     2
#> 5 12/17/18     b     x2     4
#> 6 12/17/18     b     x3     6


reprex package(v0.2.0)于2018-04-20创建。

08-24 18:35