4

背景

现在,我有一个形状如下的数据框:

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() 并将其转换为数字,但是可以推广到任意数量的实例的解决方案是什么?

4

1 回答 1

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>

或者,dcast在添加时间变量后使用“reshape2”:

dcast(example, sid ~ time, value.var="monthday")
于 2012-12-12T02:28:36.453 回答