现在,我的数据框形状如下:
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
等
我一直在尝试使用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()并将其转换为数字,但什么是可以推广到任意数量的实例的解决方案?
答案 0 :(得分:3)
您可以使用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")