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 で変更済み = Y の行は 12 行、グループ A で変更済み = 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 に答える