【问题标题】:R: Frequency and mean of variablesR:变量的频率和平均值
【发布时间】:2012-08-07 19:37:24
【问题描述】:

我有以下问题:我有下表:

> data
    StartPoint EndPoint timeDiff
1         A91    TX043      258
2         A91    TX048      547
3         A92    TX088      330
4         A91    TX088      289
5         A91    TX043      387
6         A92    TX088      241
7         A91    TX088      213
8         A92    TX043      295
9         A91    TX088      518
10        A92    TX088      414

我需要以下形式的聚合:

StartPoint  EndPoint  count  mean(timeDiff)
   A91         TX088    3    mean of 289,213 and 518
   A91         TX043    2    mean of 258 and 387
   A91         TX048    1     547
   A92         TX088    3    mean of 330, 241 and 414
   A92         TX043    1     295

count 是相同 StartPoint 和 EndPoint 对的出现次数,mean 是具有相同 StartPoint 和 EndPoint 对的条目的 timeDiff 的平均值。结果应按 StartPoint、count 和 EndPoint 排序。

任何帮助将不胜感激。

提前致谢, 杉

我的数据:

data <- structure(list(StartPoint = c("A91", "A91", "A92", "A91", "A91", "A92", "A91", "A92", "A91", "A92"), EndPoint = c("TX043", "TX048", "TX088", "TX088", "TX043", "TX088", "TX088", "TX043", "TX088", "TX088"), timeDiff = c(258, 547, 330, 289, 387, 241, 213, 295, 518, 414)), .Names = c("StartPoint", "EndPoint", "timeDiff"), row.names = c(NA, 10L), class = "data.frame")

【问题讨论】:

    标签: r count aggregate mean


    【解决方案1】:

    您可以使用基本函数aggregate

    aggregate(timeDiff~StartPoint+EndPoint,data,function(x) cbind(length(x),mean(x)))
      StartPoint EndPoint timeDiff.1 timeDiff.2
    1        A91    TX043     2.0000   322.5000
    2        A92    TX043     1.0000   295.0000
    3        A91    TX048     1.0000   547.0000
    4        A91    TX088     3.0000   340.0000
    5        A92    TX088     3.0000   328.3333
    

    但是plyr 包中的ddply 可能会产生更令人满意的结果:

    library(plyr)
    ddply(data,c(.(StartPoint),.(EndPoint)),summarise,count=length(timeDiff),mean=mean(timeDiff))
      StartPoint EndPoint count     mean
    1        A91    TX043     2 322.5000
    2        A91    TX048     1 547.0000
    3        A91    TX088     3 340.0000
    4        A92    TX043     1 295.0000
    5        A92    TX088     3 328.3333
    

    【讨论】:

    • 在 ddply 调用中,这个 .(StartPoint, EndPoint) 也应该可以工作(少打字...)
    • 完美!我想到了这两个功能,但我不知道如何组合这些列。现在我看到了答案,这完全有道理:)
    【解决方案2】:

    您可以使用例如 data.table:

    library(data.table)
    data <- data.table(data)
    data[, list(count=length(timeDiff), mean=mean(timeDiff)), by=c("StartPoint", "EndPoint")]
       StartPoint EndPoint count     mean
    1:        A91    TX043     2 322.5000
    2:        A91    TX048     1 547.0000
    3:        A92    TX088     3 328.3333
    4:        A91    TX088     3 340.0000
    5:        A92    TX043     1 295.0000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 2023-03-13
      • 1970-01-01
      • 2021-10-15
      相关资源
      最近更新 更多