【问题标题】:How to subtract groups within a data frame?如何减去数据框中的组?
【发布时间】:2014-07-03 07:50:09
【问题描述】:

获取这个数据框...

df <- data.frame(cat = rep(c('cat1','cat2','cat3'),each=3),
                 subcat = rep(c('a','b','c'),3),
                 y1 = c(rep(10,3),rep(1,6)),
                 y2 = c(rep(10,3),1:6))

df:

cat subcat y1 y2
cat1      a 10 10
cat1      b 10 10
cat1      c 10 10
cat2      a  1  1
cat2      b  1  2
cat2      c  1  3
cat3      a  1  4
cat3      b  1  5
cat3      c  1  6

我希望从 cat1 中减去 cat2 和 cat3...并将生成的 cat 称为 new.cat1 之类的东西。我正在寻找的结果应该是一个看起来像这样的数据框(或者它可以简单地附加到 df。)

     cat subcat y1 y2
new.cat1      a  8  5
new.cat1      b  8  3
new.cat1      c  8  1

在此示例中,我只有一个子类别,但我正在寻找一种可能具有多个子类别的方法。有什么帮助吗?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    您可以使用以下公式尝试aggregate

    df
    ##    cat subcat y1 y2
    ## 1 cat1      a 10 10
    ## 2 cat1      b 10 10
    ## 3 cat1      c 10 10
    ## 4 cat2      a  1  1
    ## 5 cat2      b  1  2
    ## 6 cat2      c  1  3
    ## 7 cat3      a  1  4
    ## 8 cat3      b  1  5
    ## 9 cat3      c  1  6
    
    res <- aggregate(formula = cbind(y1, y2) * ifelse(cat == "cat1", 1, -1) ~ subcat, data = df, 
        FUN = sum)
    cbind(cat = "new.cat1", res)
    ##        cat subcat y1 y2
    ## 1 new.cat1      a  8  5
    ## 2 new.cat1      b  8  3
    ## 3 new.cat1      c  8  1
    

    【讨论】:

    • Hmmmm... 我认为这可行,但我的猜测是,一个拥有的子类别越多,ifelse 表达式就必须越复杂。但这是朝着正确方向迈出的重要一步,非常感谢!
    【解决方案2】:

    您可以使用plyr::ddply。不知道你希望它如何附加到df

    > library(plyr)
    > ddp <- ddply(df, .(subcat), summarize, 
            y1 = sum(y1[1], -y1[2:3]), y2 = sum(y2[1], -y2[2:3]))
    > cbind(cat = 'new.cat1', ddp)
    #        cat subcat y1 y2
    # 1 new.cat1      a  8  5
    # 2 new.cat1      b  8  3
    # 3 new.cat1      c  8  1
    

    【讨论】:

    • 谢谢。虽然我认为这适用于我提供的示例,但这依赖于使用行索引进行减法。我必须注意并在代码中输入相关索引才能使其正常工作......此外,我认为这不适用于多个子类别,嗯?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2011-06-20
    • 2013-12-10
    相关资源
    最近更新 更多