【问题标题】:Calculating statistics on subsets of data [duplicate]计算数据子集的统计数据[重复]
【发布时间】:2013-01-26 13:27:42
【问题描述】:

这是我的数据的一个可重复的小例子:

> mydata <- structure(list(subject = c(1, 1, 1, 2, 2, 2), time = c(0, 1, 2, 0, 1, 2), measure = c(10, 12, 8, 7, 0, 0)), .Names = c("subject", "time", "measure"), row.names = c(NA, -6L), class = "data.frame")

> mydata

subject  time  measure
1          0      10
1          1      12
1          2       8
2          0       7
2          1       0
2          2       0

我想为该特定主题生成一个包含measure 平均值的新变量,所以:

subject  time  measure  mn_measure
1          0      10      10
1          1      12      10
1          2       8      10
2          0       7      2.333
2          1       0      2.333
2          2       0      2.333

除了以编程方式循环遍历所有记录或先重塑为宽格式之外,有没有一种简单的方法可以做到这一点?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    使用基本 R 函数 ave(),尽管它的名称令人困惑,但它可以计算各种统计数据,包括 mean

    within(mydata, mean<-ave(measure, subject, FUN=mean))
    
      subject time measure      mean
    1       1    0      10 10.000000
    2       1    1      12 10.000000
    3       1    2       8 10.000000
    4       2    0       7  2.333333
    5       2    1       0  2.333333
    6       2    2       0  2.333333
    

    请注意,我使用within 只是为了缩短代码。这是没有within()的等价物:

    mydata$mean <- ave(mydata$measure, mydata$subject, FUN=mean)
    mydata
      subject time measure      mean
    1       1    0      10 10.000000
    2       1    1      12 10.000000
    3       1    2       8 10.000000
    4       2    0       7  2.333333
    5       2    1       0  2.333333
    6       2    2       0  2.333333
    

    【讨论】:

    • FUN = mean 是不必要的,对吗?这是默认的FUN
    【解决方案2】:

    或者使用data.table 包:

    require(data.table)
    dt <- data.table(mydata, key = "subject")
    dt[, mn_measure := mean(measure), by = subject]
    
    #   subject time measure mn_measure
    # 1:       1    0      10  10.000000
    # 2:       1    1      12  10.000000
    # 3:       1    2       8  10.000000
    # 4:       2    0       7   2.333333
    # 5:       2    1       0   2.333333
    # 6:       2    2       0   2.333333
    

    【讨论】:

      【解决方案3】:

      您可以使用plyr 包中的ddply

      library(plyr)
      res = ddply(mydata, .(subject), mutate, mn_measure = mean(measure))
      res
        subject time measure mn_measure
      1       1    0      10  10.000000
      2       1    1      12  10.000000
      3       1    2       8  10.000000
      4       2    0       7   2.333333
      5       2    1       0   2.333333
      6       2    2       0   2.333333
      

      【讨论】:

        猜你喜欢
        • 2014-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2023-03-22
        • 1970-01-01
        • 2021-11-16
        • 2020-12-23
        相关资源
        最近更新 更多