背景
现在,我有一个形状如下的数据框:
example = structure(list(sid = c(39, 40, 41, 42, 42, 43, 43, 44, 45, 45,
46, 46, 47, 48, 49, 49, 50, 51, 52, 52, 53), monthday = c("42",
"44", "46", "410", "428", "423", "49", "411", "416", "430", "418",
"426", "419", "420", "420", "53", "421", "424", "425", "53",
"511")), .Names = c("sid", "monthday"), row.names = c(301L, 300L,
298L, 296L, 282L, 288L, 297L, 295L, 294L, 281L, 293L, 285L, 292L,
291L, 290L, 278L, 289L, 287L, 286L, 279L, 270L), class = "data.frame")
换句话说,它很高:
sid monthday
39 42
40 44
41 46
42 410
42 428
43 423
43 49
最终,我想把它变成一个宽格式:
sid monthday1 monthday2
39 42 NA
40 44 NA
41 46 NA
42 410 428
43 423 49
ETC
我一直在尝试使用 reshape 和 reshape2 包以及聚合,例如:
library(reshape2)
temp = melt(example,id.vars=c("sid"))
data.wide <- dcast(temp, sid ~ variable, value.var="value")
但无法将我的大脑包裹在它周围。我突然想到,如果我能确定每个 sid 的出现,我就能解决我的问题。
即时问题
那么如何取上面的高数据 sid 列我创建一个新变量来指示每个 sid 的出现:
sid occur
39 1
40 1
41 1
42 1
42 2
43 1
43 2
该occur
变量表明 sid 值 39、40 和 41 仅出现一次,而 42 和 43 具有第一个和第二个实例。如果我只有两个实例,我可以使用 duplicated() 并将其转换为数字,但是可以推广到任意数量的实例的解决方案是什么?