我正在努力想出一个正确的过程来转换我正在进行分析的一些数据而不需要使用脚本语言。
数据的格式类似于以下
data.frame(Group=LETTERS[1:3],Total=c(100,120,130),Modified=c(12,15,32))
Group Total Modified
1 A 100 12
2 B 120 15
3 C 130 32
我希望结果数据框看起来像
+-------+----------+
| Group | Modified |
+-------+----------+
| A | Y |
| A | Y |
| A | Y |
| . | . |
| . | . |
| . | . |
| A | N |
| A | N |
| B | Y |
| B | Y |
| . | . |
| . | . |
| . | . |
| B | N |
+-------+----------+
应该有12行,A组和修改= Y,88行,A组和修改= N. B,C等也是如此。
在大多数情况下,还需要在每一行上添加其他列以及组信息。
答案 0 :(得分:10)
您可以将rep
与相应的times
参数一起使用。
用于编码优雅的data.table
解决方案
library(data.table)
# your data is in the data.frame DF
DF <- data.table(DF)
levels <- c('Y', 'N')
DF[,list(Modified = rep(levels,c(Modified,Total-Modified))),by = Group]
答案 1 :(得分:3)
要转换的代码:
result <- do.call(rbind,
by(test,
test$Group,
function(x)
data.frame(
Group=x$Group[1],
Modified=rep(c("Y","N"),c(x$Modified,x$Total - x$Modified))
)
)
)
输出如:
> head(result)
Group Modified
A.1 A Y
A.2 A Y
A.3 A Y
A.4 A Y
A.5 A Y
A.6 A Y
检查它是否有效:
> with(result,table(Group,Modified))
Modified
Group N Y
A 88 12
B 105 15
C 98 32
答案 2 :(得分:0)
略有不同的方法:
dat <- data.frame(Group=LETTERS[1:3],Total=c(100,120,130),Modified=c(12,15,32))
dat$diff <- dat$Total - dat$Modified
library(reshape2)
dat2 <- melt(dat[, -2])
dat2 <- dat2[order(dat2$Group), ]
levels(dat2$variable) <- c("Y", "N")
dat2 <- dat2[rep(1:nrow(dat2), dat2$value), -3]
rownames(dat2) <- NULL