1

これは複雑な問題ではなく、解決策はありますが、もっと良い方法があるという気持ちを揺るがすことはできません。

次のように、カテゴリごとの成功と機会の集計を含むdata.frameがあります。

testFrame <- data.frame(successes = c(100, 150, 18),
                        opportunities = c(215, 194, 40),
                        category = LETTERS[1:3])
testFrame$category <- as.character(testFrame$category)

これを「背の高い」data.frameに変換したいと思います。ここで、1と0の1つの列は成功/失敗を示し、2番目の列はカテゴリラベルを示します。私は次のコードでこれを行うことができます:

tallFrame <- lapply(1:nrow(testFrame), function(rr){
  cbind(rep(c(1, 0), c(testFrame[rr, "successes"], testFrame[rr, "opportunities"]-testFrame[rr, "successes"])), testFrame[rr, "category"])
  })
tallFrame <- data.frame(do.call(rbind, tallFrame))

結果tallFrameは、問題なくdata.frameに変換できるマトリックスになりますが、これは単純なタスクの多くのコードのようです。確かに、これをよりコード効率的に行う方法があります。おそらく、plyrまたはreshapeを使用するか、コードゴルフを探しているだけです。

前もって感謝します。

4

2 に答える 2

3

なぜこれを行う必要があるのか​​不思議に思うかもしれませんが、それでも...

を使用したbaseソリューションrep

with(testFrame, data.frame(category = rep(category, opportunities), 
    indicator =  unlist(mapply(rep, times = c(successes,  opportunities-successes), 
      MoreArgs = list(x = c(0,1))))))

data.tableソリューション(コーディングエレガンス(おそらくコードゴルフのライバル)

library(data.table)
DT <- data.table(testFrame)
DT[,list(indicator = rep(c(0,1), c(successes,  opportunities-successes))), by = category]
于 2012-10-21T23:13:24.163 に答える
2

そしてここにplyrあなたが探していた解決策があります:

ddply(testFrame, .(category), function(x) {
     data.frame(raw = c(rep(1,x$success), rep(0, x$opportunities - x$success)), 
        category = x$category)
    })
于 2012-10-21T23:28:38.203 に答える