指定された条件の列の行の転置/変形

私は以下のデータを持っています:

request   user   group
1         1      1
4         1      1
7         1      1
5         1      2
8         1      2
1         2      3
4         2      3
7         2      3
9         2      4

私は要求シーケンスを抽出し、これらを列に転記したいと思います。

結果は次のようになります。

user   group   request1   request2   request3
1      1       1          4          7
1      2       5          8          NA
2      3       1          4          7
2      4       9          NA         NA

私はddply(plyr)でこれをやろうとしましたが、実際の解決策には達しませんでした。

前もって感謝します!

3

2 答え

library(reshape)

# Make some fake data
dat <- data.frame(user = c(1,1,1,2,2,3), group = c(1,1,1,1,1,2), request = c(1,4,7,5,8,1))
# Add in an ordered id
newdat <- ddply(dat, .(user, group), transform, idx = paste("request", 1:length(request), sep = ""))
# Use cast to get what we want
cast(newdat, user + group ~ idx, value = .(request))

基本的には列タイトルになるidxと呼ぶものを得るには、おそらくもっと良い方法があります。 newdatデータセットを作成せずにこれを行うことは可能かもしれませんが、これは私が考えたことです。

4
追加された
さて、これはかなりうまくいく!どうもありがとう! 1つの質問が残っています。元のデータには、ユーザーとグループごとに120件までのリクエストがあります。 Castは、 request1 request2 request3 request4 request5 request6 request10 request11 request7 などのようなidx変数の順序を変更するようです。
追加された 著者 ahs85,
答えはこちらで見つかりました: idx = sprintf( "request_%03d"、1:length(request)) idx = paste( "request"、1:length(request)、sep = "") >素晴らしい作品!
追加された 著者 ahs85,

aggregate gets you very close:

dat <- data.frame(
    user = c(1,1,1,2,2,3,3,3,4), 
    group = c(1,1,1,1,1,2,2,2,2), 
    request = c(1,4,7,5,8,1,4,7,9)
)

aggregate(request~group + user, dat, FUN=c)

  group user request
1     1    1 1, 4, 7
2     1    2    5, 8
3     2    3 1, 4, 7
4     2    4       9
2
追加された
私はここでエラーが表示されます: get(as.character(FUN)、mode = "function"、envir = envir)のエラー: 'function'モードのオブジェクト 'FUN'が見つかりませんでした。
追加された 著者 ahs85,
編集 FUN = "c" が機能します。
追加された 著者 ahs85,