将df熔化成3列

时间:2016-06-22 11:54:48

标签: r reshape melt

我正在尝试将以下数据集融合为3列 - '小时','变量'和'群集'

> head(kpitdur)
       hr_0  hr_1030  hr_1130   hr_160   hr_180   hr_190   hr_200   hr_630   hr_830
1  79.08333 63.06667 63.06667 63.06667 63.06667 63.06667 63.06667 65.73333 63.06667
2  71.45000 51.80000 51.80000 51.80000 51.80000 51.80000 51.80000 71.45000 51.80000
3  86.96667 56.91667 56.91667 56.91667 56.91667 56.91667 56.91667 69.00000 56.91667
4  91.53333 77.38333 61.83333 77.38333 77.38333 77.38333 77.38333 77.38333 77.38333
5  91.83333 78.10000 78.10000 78.10000 78.10000 78.10000 78.10000 78.10000 78.10000
6 111.41667 65.75000 65.75000 65.75000 65.75000 65.75000 65.75000 80.63333 65.75000
    hr_930 cluster
1 63.06667       2
2 51.80000       2
3 56.91667       2
4 77.38333       1
5 78.10000       1
6 65.75000       1

然而,当我在熔化中使用下面的公式时,我只给了两列,我不知道如何解决这个问题。我尝试在value.name中输入不同的变量名,但这不起作用。怎么可以将这个数据集融合成三个独立的列?

> melted <- melt(kpitdur, value.name = "cluster")
No id variables; using all as measure variables

> head(melted)
  variable   cluster
1     hr_0  79.08333
2     hr_0  71.45000
3     hr_0  86.96667
4     hr_0  91.53333
5     hr_0  91.83333
6     hr_0 111.41667

> tail(melted)
      variable cluster
11699  cluster       1
11700  cluster       1
11701  cluster       1
11702  cluster       2
11703  cluster       1
11704  cluster       1

以下是数据样本:

> dput(df)
structure(list(hr_0 = c(79.0833333333333, 71.45, 86.9666666666667, 
91.5333333333333, 91.8333333333333, 111.416666666667), hr_1030 = c(63.0666666666667, 
51.8, 56.9166666666667, 77.3833333333333, 78.1, 65.75), hr_1130 = c(63.0666666666667, 
51.8, 56.9166666666667, 61.8333333333333, 78.1, 65.75), hr_160 = c(63.0666666666667, 
51.8, 56.9166666666667, 77.3833333333333, 78.1, 65.75), hr_180 = c(63.0666666666667, 
51.8, 56.9166666666667, 77.3833333333333, 78.1, 65.75), hr_190 = c(63.0666666666667, 
51.8, 56.9166666666667, 77.3833333333333, 78.1, 65.75), hr_200 = c(63.0666666666667, 
51.8, 56.9166666666667, 77.3833333333333, 78.1, 65.75), hr_630 = c(65.7333333333333, 
71.45, 69, 77.3833333333333, 78.1, 80.6333333333333), hr_830 = c(63.0666666666667, 
51.8, 56.9166666666667, 77.3833333333333, 78.1, 65.75), hr_930 = c(63.0666666666667, 
51.8, 56.9166666666667, 77.3833333333333, 78.1, 65.75), cluster = c(2L, 
2L, 2L, 1L, 1L, 1L)), .Names = c("hr_0", "hr_1030", "hr_1130", 
"hr_160", "hr_180", "hr_190", "hr_200", "hr_630", "hr_830", "hr_930", 
"cluster"), row.names = c(NA, 6L), class = "data.frame")

3 个答案:

答案 0 :(得分:0)

你可以做到

reshape(
  data = kpitdur, 
  varying = -11, 
  direction = "long", 
  sep="_", 
  timevar = "variable"
)[-4]
#        cluster variable        hr
# 1.0          2        0  79.08333
# 2.0          2        0  71.45000
# 3.0          2        0  86.96667
# 4.0          1        0  91.53333
# 5.0          1        0  91.83333
# 6.0          1        0 111.41667
# 1.1030       2     1030  63.06667
# 2.1030       2     1030  51.80000
# 3.1030       2     1030  56.91667
# 4.1030       1     1030  77.38333
# ...

答案 1 :(得分:0)

您也可以使用tidyr

执行此操作
library(tidyr)

data_long <- gather(df, variable, cluster,  hr_0:hr_930)
names(data_long)[3] <- "value"

> head(data_long, 5)
  cluster variable    value
1       2     hr_0 79.08333
2       2     hr_0 71.45000
3       2     hr_0 86.96667
4       1     hr_0 91.53333
5       1     hr_0 91.83333

答案 2 :(得分:0)

# Option 1 using reshape2
library(reshape2)

df %>% 
    melt(value.name = "cluster")  # incorrect original result

df %>% 
    melt(id.vars = "cluster", value.name = "variable")

或者...

# Option 2 using tidyr
library(tidyr)

df %>% 
    gather(hour, variable, -cluster)