假设我们需要计算连续数大于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)
预期输出是第三列状态
答案 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'分组,获取逻辑向量的rle
(temp >=40
),通过values
复制lengths
并将其相乘使用sequence
的{{1}}。 lengths
值被强制转换为TRUE/FALSE
,当将数字乘以1时,它返回该数字,而0时,我们得到0值。
1/0