拆分 - 应用于序列

时间:2014-01-16 13:26:10

标签: r

我一次又一次地遇到问题,我需要拆分data.frame,其中一列是(可能是无序的)序列。拆分应在这些行中进行,其中在序列中满足某个标准。

所以假设这个data.frame是一个简单的例子:

dt <- data.frame( A = sort(sample( 1:300, 100 )) , B = rnorm(100) )

我希望在dt中分割A时出现大4的差距,并计算B中的均值。我所做的是通过

引入id变量F
dt[ , "F" ] <- c( 0, cumsum( diff( dt[, "A"] ) > 4) )
head(dt)

   A          B F
1  2 -0.8019945 0
2  6 -0.1948101 0
3  7  0.1961203 0
4 12 -0.2478185 1
5 13  1.2571841 1
6 14  2.1354909 1

然后

library(plyr)
ddply( dt, .(F), summarise,
   A.range = paste( range(A), collapse = "-" ),
   B.mean  = mean( B )
)

    F A.range      B.mean
1   0     2-7 -0.26689475
2   1   12-17  0.57051336
3   2   25-25  0.29054572

我的问题是:base或其他软件包(plyrdata.tablezoo,...)中是否没有此类函数替换{{1诀窍并给我更灵活的分裂标准?

1 个答案:

答案 0 :(得分:1)

我认为你是以正确的方式做到的。为了使其更有效(从编程角度来看),您可以直接在ddply()调用

中调用cumsum / diff [或其他函数]
ddply( dt, .(F=c( 0, cumsum( diff( dt[, "A"] ) > 4) )), summarise,
   A.range = paste( range(A), collapse = "-" ),
   B.mean  = mean( B )
)