Background
现在,我有一个数据框,形状如下:
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
等
我一直在尝试使用重塑和重塑 2 包以及聚合,例如:
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() 并将其转换为数字,但是可以推广到任意数量的实例的解决方案是什么?
您可以使用ave
来生成"时间":
example$time <- ave(example$sid, example$sid, FUN = seq_along)
head(example)
# sid monthday time
# 301 39 42 1
# 300 40 44 1
# 298 41 46 1
# 296 42 410 1
# 282 42 428 2
# 288 43 423 1
reshape(example, direction = "wide", idvar="sid", timevar="time")
# sid monthday.1 monthday.2
# 301 39 42 <NA>
# 300 40 44 <NA>
# 298 41 46 <NA>
# 296 42 410 428
# 288 43 423 49
# 295 44 411 <NA>
# 294 45 416 430
# 293 46 418 426
# 292 47 419 <NA>
# 291 48 420 <NA>
# 290 49 420 53
# 289 50 421 <NA>
# 287 51 424 <NA>
# 286 52 425 53
# 270 53 511 <NA>
或者,在添加时间变量后从"reshape2"dcast
:
dcast(example, sid ~ time, value.var="monthday")