R 计算给定数据帧中连续不大于阈值但按组的个数

R 计算给定数据帧中连续不大于阈值但按组的个数,r,R,假设我们需要对大于40的连续数进行计数,但分组(tag)时,连续数的计数应独立于tag 例如,我们从标记列中有6个组,因此对于每个组,我们将计算temp变量超过阈值的次数。下面是我试图展示的可复制示例,我粘贴了预期输出的快照 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

假设我们需要对大于40的连续数进行计数,但分组(tag)时,连续数的计数应独立于tag

例如,我们从标记列中有6个组,因此对于每个组,我们将计算temp变量超过阈值的次数。下面是我试图展示的可复制示例,我粘贴了预期输出的快照

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)

tag我们可以使用
data.table
。将“data.frame”转换为“data.table”(
setDT(df)
),使用逻辑向量的游程id创建一个分组变量(
temp>=40
),按“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

或者使用
base R
中的
rle
。我们使用
ave
按“tag”分组,得到逻辑向量(
temp>=40
)的
rle
,用
长度
复制
,并与
长度
序列相乘。
TRUE/FALSE
值强制为
1/0
,当数字与1相乘时,它返回该数字,而与0相乘时,我们得到0值

df$status <-  with(df, ave(temp >= 40, tag, FUN = function(x) {
           rl <- rle(x)
          with(rl, sequence(lengths) * rep(values, lengths))}))
df$status 
#[1] 1 2 3 4 5 0 1 2 0 0 0 0 1 2 3 4 5 0 0 0 1 2 3 4 5
#[26] 0 1 2 0 0 0 0 1 2 3 4 5 0 0 0 1 2 3 4 5 0 1 2 0 0 0 0 1 2 3 4 5 0 0 0
df$status=40,tag,FUN=function(x){

rl我想有一个输入错误。你的第三组应该从Sr开始。No:21@akrun是的,它的打字错误,我同意这一点,先生要求你,你能解释一下代码,这将是真正有帮助的吗