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

私はreshapeとreshape2パッケージ、そして次のような集約を使って物事を試してきました:

library(reshape2)
temp = melt(example,id.vars=c("sid"))
data.wide <- dcast(temp, sid ~ variable, value.var="value")

しかし、私の脳をその周りに巻き付けることはできません。各シドの発生を特定できれば、問題を解決できると思います。

差し迫った問題

したがって、上記のトールデータのsid列を取得するには、各sidの出現率を示す新しい変数を作成します。

sid   occur 
39     1   
40     1   
41     1   
42     1
42     2 
43     1
43     2

変数は、occursid値39、40、および41が1回だけ表示され、42と43には1番目と2番目のインスタンスがあることを示しています。インスタンスが2つしかない場合は、duplicate()を使用してそれを数値に変換できますが、任意の数のインスタンスに一般化できるソリューションは何ですか?

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時間変数を追加した後に from "reshape2" を使用します。

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