根据R中的第三个二进制变量创建双重条目

时间:2014-02-12 18:28:04

标签: r double

我想创建一个双输入数据框(ds2)。请参阅下面的视觉图示。

变量x和y需要根据变量“order”分别重新编码为两个新变量(x1,x2; y1,y2)。具体来说,如果order == 1,则x变为x1;如果order == 2 x变为x2。这同样适用于y。此外,需要添加一个新的二进制变量“random”,随机选择(1,0)一个“pairId”。

我已尝试使用合并功能,但作为一个完整的新手,我还没有找到一个好的解决方案。任何帮助都非常感谢。

What I have got:

> head(ds1)
     id pairId order  x   y 

     1  6826   1      74  100
     2  6826   2      70  5
     3  6371   1      70  5
     4  6371   2      71  8



What I would like to get:

> head(ds2)
     id random pairId order x1 x2  y1  y2

     1  1      6826   1     74 70  100 5
     2  0      6826   2     70 74  5   100
     3  0      6371   1     70 71  5   8
     4  1      6371   2     71 70  8   5

1 个答案:

答案 0 :(得分:1)

我采用的方法是只扩展数据一次,然后重新排列(重命名,真正)列并更改order的值。只有在那之后才会抛出随机化。然后只是在其他删除的数据(id)中合并并重新排列行和列(这些最后两个不是必需的,但要使其显示您所显示的格式)。

library("reshape2")
library("plyr")
wide <- dcast(melt(ds1, 
                   id.vars=c("pairId", "order"), 
                   measure.vars=c("x","y")),
              pairId~variable+order)

o1 <- rename(wide, c("x_1" = "x1", "x_2" = "x2", "y_1" = "y1", "y_2" = "y2"))
o1$order = 1
o2 <- rename(wide, c("x_1" = "x2", "x_2" = "x1", "y_1" = "y2", "y_2" = "y1"))
o2$order = 2

ds2 <- rbind(o1, o2)
ds2 <- ddply(ds2, .(pairId), mutate, random = sample(c(0,1)))

# if you really need `id` in there, you can merge it back in

ds2 <- merge(ds2, ds1[c("pairId", "order", "id")])

# sorted and ordered

ds2 <- ds2[order(ds2$id),
           c("id", "random", "pairId", "order", "x1", "x2", "y1", "y2")]

这给出了

> ds2
  id random pairId order x1 x2  y1  y2
3  1      0   6826     1 74 70 100   5
4  2      1   6826     2 70 74   5 100
1  3      0   6371     1 70 71   5   8
2  4      1   6371     2 71 70   8   5