这不是一个复杂的问题,我有一个解决方案,但我不能感觉有更好的方法:
我有一个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而不会出现任何问题,但这似乎是一个简单任务的大量代码。当然有一种方法可以更有效地编写代码,可能使用plyr
或reshape
,或者我只是想找一些高尔夫代码。
提前致谢。
答案 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)
})