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 表示成功/失败,第二列带有类别标签。我可以使用以下代码执行此操作:

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,但这似乎是一个简单任务的大量代码。当然,有一种方法可以更高效地执行此操作,也许使用plyror 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 回答