【问题标题】:Averaging over continuous blocks对连续块进行平均
【发布时间】:2011-03-30 18:43:35
【问题描述】:

我有这样的数据:

f  x 
A 1.1
A 2.2
A 3.3
B 3.5
B 3.7
B 3.9
B 4.1
B 4.5
A 5.1
A 5.2
C 5.4
C 5.5
C 6.1
B 6.2
B 6.3

我想在f 的连续块上平均x,得到这个,类似于tapply(...,mean),但要知道它不应该以原始顺序混合分开的块:

f  x
A 2.2
B 3.94
A 5.15 
C 5.67
B 6.25

【问题讨论】:

    标签: r


    【解决方案1】:

    这是一种方法:

    ## reproducible code for example
    dat <- read.table(foo <- textConnection("f  x 
    A 1.1
    A 2.2
    A 3.3
    B 3.5
    B 3.7
    B 3.9
    B 4.1
    B 4.5
    A 5.1
    A 5.2
    C 5.4
    C 5.5
    C 6.1
    B 6.2
    B 6.3
    "), header = TRUE)
    close(foo)
    

    我们使用rle() 来计算f 的运行长度,并创建一个新因子fac 来索引f 中的更改,以便找到更好的词。然后我们在 ffac 上进行聚合:

    lens <- with(dat, rle(as.character(f)))
    dat$fac <- with(lens, factor(rep(seq_along(lengths), times = lengths)))
    aggregate(x ~ f + fac, data = dat, FUN = mean)
    

    给予:

    > aggregate(x ~ f + fac, data = dat, FUN = mean)
      f fac        x
    1 A   1 2.200000
    2 B   2 3.940000
    3 A   3 5.150000
    4 C   4 5.666667
    5 B   5 6.250000
    

    如果不希望这样做,我们可以轻松地删除结果中的第二列 fac

    > aggregate(x ~ f + fac, data = dat, FUN = mean)[,-2]
      f        x
    1 A 2.200000
    2 B 3.940000
    3 A 5.150000
    4 C 5.666667
    5 B 6.250000
    

    【讨论】:

    • 啊,我明白了... ;-) 顺便说一下,聚合的使用很好。
    【解决方案2】:

    rle 是一种可能性:

    > id <- rle(as.character(Data$f))
    > Means <-tapply(Data$x,rep(1:length(id$lengths),id$lengths),mean)    
    > data.frame(Means,f=id$values)
         Means f
    1 2.200000 A
    2 3.940000 B
    3 5.150000 A
    4 5.666667 C
    5 6.250000 B
    

    它为您提供运行和值,因此您可以同时使用两者。

    【讨论】:

    • 是的,我忘了 rle... Acc 最优雅
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    相关资源
    最近更新 更多