标识变量中项的出现次数

时间:2012-12-12 01:43:16

标签: r

背景

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

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

1 个答案:

答案 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")