R - 使用变量对重新组织熔化的data.frame

maj*_*nik 7 r dataframe reshape2

对不起,我在帖子标题中并不是特别明确.我希望我的例子会更清楚!

如果我从数据框开始:

test.df <- data.frame(group=c(rep("a",4), rep("b",4)), 
                  var=rep(1:4,2),
                  min= runif(8),
                  q25=runif(8,1,2),
                  q75=runif(8,2,3),
                  max=runif(8,3,4))
head(test.df,2)
  group var        min      q25      q75      max
1     a   1 0.59078504 1.199138 2.119283 3.869486
2     a   2 0.06131107 1.676109 2.603068 3.739955
Run Code Online (Sandbox Code Playgroud)

我知道可以用id = c(group,var)来融化它

library(reshape2)
head(melt(test.df, id=c("group", "var")),2)
  group var variable      value
1     a   1      min 0.59078504
2     a   2      min 0.06131107
Run Code Online (Sandbox Code Playgroud)

但我正在寻找的方法是通过配对min-max和q25-q75获得两个"值"列,以便它看起来像:

  group var variable  value1     value2  
1     a   1 min-max   0.59078504 3.869486
1     a   1 q25-q75   1.199138   2.119283
2     a   2 min-max   0.06131107 3.739955
2     a   2 q25-q75   1.676109   2.603068 
Run Code Online (Sandbox Code Playgroud)

我有点卡在融化/投射上,不能把自己拉出来,我敢肯定必须有一个简洁的方法来实现这一目标吗?

编辑:这是一个简单的例子,只有两对变量 - 这个想法是为了解决这个问题,需要最少的"手动"工作.

the*_*ail 3

另一种尝试:

newnames <- c("value1","value2")
data.frame(
  test.df[c("group","var")],
  variable=rep(c("min-max","q25-q75"),each=nrow(test.df)),
  rbind(
    setNames(test.df[c("min","max")],newnames),
    setNames(test.df[c("q25","q75")],newnames)
  )
)
Run Code Online (Sandbox Code Playgroud)

结果:

   group var variable    value1   value2
1      a   1  min-max 0.6939545 3.479807
2      a   2  min-max 0.5646825 3.564637
3      a   3  min-max 0.3509824 3.928308
4      a   4  min-max 0.4217888 3.376821
5      b   1  min-max 0.6493916 3.933157
6      b   2  min-max 0.3978330 3.129940
7      b   3  min-max 0.4407376 3.707715
8      b   4  min-max 0.1651875 3.798546
9      a   1  q25-q75 1.3531055 2.242076
10     a   2  q25-q75 1.1811900 2.240188
11     a   3  q25-q75 1.3043822 2.695175
12     a   4  q25-q75 1.3315480 2.542576
13     b   1  q25-q75 1.2397527 2.107442
14     b   2  q25-q75 1.1973467 2.545511
15     b   3  q25-q75 1.9193746 2.502551
16     b   4  q25-q75 1.0425474 2.225601
Run Code Online (Sandbox Code Playgroud)