计算连续数不大于阈值但在给定数据框中按组计算

时间:2017-02-14 06:35:13

标签: r

假设我们需要计算连续数大于40但是分组(标记),以便连续数的计数应独立于标记。

例如,我们从标记列中有6个组,因此对于每个组,我们将计算临时变量已经超过阈值的次数。下面是可重现的示例我试图与此一起出现我粘贴了预期输出的快照。 / p>

tag<- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
        3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,5, 5,
        6, 6, 6, 6, 6, 6, 6, 6, 6, 6)
temp<- c(43, 44, 45, 41, 43, 38, 40, 41, 39, 37, 37, 39, 45, 42, 41, 43, 44, 39,38,
         37, 43, 44, 45, 41, 43, 38, 40, 41, 39, 37, 37, 39, 45, 42, 41, 43, 44, 
        39, 38, 37, 43, 44, 45, 41, 43, 38, 40, 41, 39, 37, 37, 39, 45, 42, 41,43,
         44, 39, 38, 37)

df=data.frame(tag=tag,temp=temp)

预期输出是第三列状态

enter image description here

1 个答案:

答案 0 :(得分:2)

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(df)),使用逻辑向量(temp >= 40)的run-length-id创建分组变量,按'tag'分组, 'grp'并将i设置为逻辑条件,我们将'status'指定为行序列(seq_len(.N)),并将'status'中的'NA'元素转换为0

library(data.table) 
setDT(df)[, grp := rleid(temp >= 40)][temp >= 40, status := seq_len(.N) , .(tag, grp)
             ][is.na(status), status := 0][]
head(df, 20)    
#    tag temp grp status
# 1:   1   43   1      1
# 2:   1   44   1      2
# 3:   1   45   1      3
# 4:   1   41   1      4
# 5:   1   43   1      5
# 6:   1   38   2      0
# 7:   1   40   3      1
# 8:   1   41   3      2
# 9:   1   39   4      0
#10:   1   37   4      0
#11:   2   37   4      0
#12:   2   39   4      0
#13:   2   45   5      1
#14:   2   42   5      2
#15:   2   41   5      3
#16:   2   43   5      4
#17:   2   44   5      5
#18:   2   39   6      0
#19:   2   38   6      0
#20:   2   37   6      0

或使用rle中的base R。我们使用ave按'tag'分组,获取逻辑向量的rletemp >=40),通过values复制lengths并将其相乘使用sequence的{​​{1}}。 lengths值被强制转换为TRUE/FALSE,当将数字乘以1时,它返回该数字,而0时,我们得到0值。

1/0