4

我正在努力想出正确的流程来转换我正在分析的一些数据,而无需求助于脚本语言。

数据采用类似于以下的格式

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        |
    +-------+----------+

A组和Modified = Y应该有12行,A组和Modified = N应该有88行。B,C等也是如此。

在大多数情况下,需要在每一行上重复附加列以及组信息。

4

3 回答 3

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]
于 2013-02-13T00:19:29.040 回答
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
于 2013-02-13T00:23:53.333 回答
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
于 2013-02-13T01:00:06.363 回答