标识变量中项的出现次数

  • 本文关键字:标识变量 r
  • 更新时间 :
  • 英文 :


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

最新更新