广泛的数据帧到高指标数据帧

时间:2012-10-21 22:56:01

标签: r dataframe

这不是一个复杂的问题,我有一个解决方案,但我不能感觉有更好的方法:

我有一个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而不会出现任何问题,但这似乎是一个简单任务的大量代码。当然有一种方法可以更有效地编写代码,可能使用plyrreshape,或者我只是想找一些高尔夫代码。

提前致谢。

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:2)

以下是您正在寻找的plyr解决方案:

ddply(testFrame, .(category), function(x) {
     data.frame(raw = c(rep(1,x$success), rep(0, x$opportunities - x$success)), 
        category = x$category)
    })