在R中将两行排成一行

时间:2012-10-08 20:59:23

标签: r sorting dataset

我有大型数据集,如下所示:

myd <- data.frame (var1 = c("A", "A", "B1-1", "B1-1", "C", "C", "D1", "D1"),
                   var2 = c(1,    2,    2,       2,     3,  1,   1,    4))
 var1 var2
1    A    1
2    A    2
3 B1-1    2
4 B1-1    2
5    C    3
6    C    1
7   D1    1
8   D1    4

请注意,var1中的每个级别重复两次,并且在var2中有两个值。

对于var1的每个级别,我想创建一个新的数据集,其中var2值现在以行方式(短路)并组合成一个具有以下输出类型的列:

   var1    var2.h1 var2.h2      h1.h2  
1    A      1         2           12
2   B1-1    2         2           22
3    C      1         3           13
4   D1      1         4           14

2 个答案:

答案 0 :(得分:1)

library(plyr)
ddply(myd, .(var1), function(x) {
     foo <- data.frame(rbind(x$var2), sprintf("%s%s", x$var2[1], x$var2[2]))
     names(foo) <- c("var2.h1", "var2.h2", "h1.h2")
     foo
    })

var1 var2.h1 var2.h2 h1.h2
1    A       1       2    12
2 B1-1       2       2    22
3    C       3       1    31
4   D1       1       4    14

答案 1 :(得分:1)

library("reshape2")
myd$pos <- c("h1", "h2")
myd.wide <- dcast(myd, var1~pos, value.var="var2")
names(myd.wide)[2:3] <- paste("var2", names(myd.wide)[2:3], sep=".")
myd.wide$h1.h2 <- paste0(myd.wide$var2.h1, myd.wide$var2.h2)

给出了

> myd.wide
  var1 var2.h1 var2.h2 h1.h2
1    A       1       2    12
2 B1-1       2       2    22
3    C       3       1    31
4   D1       1       4    14