在R中转换data.frame的命令

时间:2013-02-12 23:56:08

标签: r dataframe

我正在努力想出一个正确的过程来转换我正在进行分析的一些数据而不需要使用脚本语言。

数据的格式类似于以下

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等也是如此。

在大多数情况下,还需要在每一行上添加其他列以及组信息。

3 个答案:

答案 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