我想创建一个双输入数据框(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
答案 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