R 计算给定数据帧中连续不大于阈值但按组的个数
假设我们需要对大于40的连续数进行计数,但分组(tag)时,连续数的计数应独立于tag 例如,我们从标记列中有6个组,因此对于每个组,我们将计算temp变量超过阈值的次数。下面是我试图展示的可复制示例,我粘贴了预期输出的快照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
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是的,它的打字错误,我同意这一点,先生要求你,你能解释一下代码,这将是真正有帮助的吗