dplyr-在同一列中连续出现,标签取决于出现的次数

dplyr-在同一列中连续出现,标签取决于出现的次数,r,dplyr,data.table,R,Dplyr,Data.table,我想使用R的dplyr和data.table来计算同一列(Temperature)中连续出现的次数,并将连续出现的次数3标记为“Discard” 扩展OP解决方案以同时使用dplyr和数据。表选项如下: library(dplyr) library(data.table) df %>% group_by(Store,RTU) %>% mutate(Flag = rleid(Temperature)) %>% group_by(Flag) %>% mutate(F

我想使用R的
dplyr
data.table
来计算同一列(
Temperature
)中连续出现的次数,并将连续出现的次数3标记为“Discard”

扩展OP解决方案以同时使用
dplyr
数据。表
选项如下:

library(dplyr)
library(data.table)

df %>% group_by(Store,RTU) %>% mutate(Flag = rleid(Temperature)) %>%
  group_by(Flag) %>%
  mutate(Flag_Temperature_check = ifelse(row_number() <= 3, "Ok","Discard"))

# # A tibble: 18 x 6
# # Groups: Flag [6]
# Time Store   RTU Temperature  Flag Flag_Temperature_check
# <int> <int> <int>       <int> <int> <chr>                 
# 1     1  1000     1          54     1 Ok                    
# 2     2  1000     1          54     1 Ok                    
# 3     3  1000     1          54     1 Ok                    
# 4     4  1000     1          54     1 Discard               
# 5     5  1000     1          54     1 Discard               
# 6     6  1000     1          56     2 Ok                    
# 7     7  1000     1          57     3 Ok                    
# 8     8  1000     1          50     4 Ok                    
# 9     9  1000     1          50     4 Ok                    
# 10    10  1000     1          50     4 Ok                    
# 11    11  1000     1          50     4 Discard               
# 12    12  1000     1          50     4 Discard               
# 13    13  1000     1          61     5 Ok                    
# 14    14  1000     1          61     5 Ok                    
# 15    15  1000     1          61     5 Ok                    
# 16    16  1000     1          61     5 Discard               
# 17    17  1000     1          61     5 Discard               
# 18    18  1000     1          58     6 Ok 
库(dplyr)
库(数据表)
df%%>%分组依据(存储,RTU)%%>%变异(标志=rleid(温度))%%>%
分组依据(标志)%>%

mutate(Flag_Temperature_check=ifelse(row_number()扩展OP的解决方案以同时使用
dplyr
数据。表
中的一个选项可以是:

library(dplyr)
library(data.table)

df %>% group_by(Store,RTU) %>% mutate(Flag = rleid(Temperature)) %>%
  group_by(Flag) %>%
  mutate(Flag_Temperature_check = ifelse(row_number() <= 3, "Ok","Discard"))

# # A tibble: 18 x 6
# # Groups: Flag [6]
# Time Store   RTU Temperature  Flag Flag_Temperature_check
# <int> <int> <int>       <int> <int> <chr>                 
# 1     1  1000     1          54     1 Ok                    
# 2     2  1000     1          54     1 Ok                    
# 3     3  1000     1          54     1 Ok                    
# 4     4  1000     1          54     1 Discard               
# 5     5  1000     1          54     1 Discard               
# 6     6  1000     1          56     2 Ok                    
# 7     7  1000     1          57     3 Ok                    
# 8     8  1000     1          50     4 Ok                    
# 9     9  1000     1          50     4 Ok                    
# 10    10  1000     1          50     4 Ok                    
# 11    11  1000     1          50     4 Discard               
# 12    12  1000     1          50     4 Discard               
# 13    13  1000     1          61     5 Ok                    
# 14    14  1000     1          61     5 Ok                    
# 15    15  1000     1          61     5 Ok                    
# 16    16  1000     1          61     5 Discard               
# 17    17  1000     1          61     5 Discard               
# 18    18  1000     1          58     6 Ok 
库(dplyr)
库(数据表)
df%%>%分组依据(存储,RTU)%%>%变异(标志=rleid(温度))%%>%
分组依据(标志)%>%

突变(标记温度检查=ifelse(行编号()使用
数据。表

library(data.table)
setDT(df)
df[, 
    Comment := ifelse(seq_len(.N) <= 3, 'OK', 'Discard'), 
    .(Store, RTU, rleid(Temperature))
][]
#    Time Store RTU Temperature Comment
# 1:    1  1000   1          54      OK
# 2:    2  1000   1          54      OK
# 3:    3  1000   1          54      OK
# 4:    4  1000   1          54 Discard
# 5:    5  1000   1          54 Discard
# 6:    6  1000   1          56      OK
# 7:    7  1000   1          57      OK
# 8:    8  1000   1          50      OK
# 9:    9  1000   1          50      OK
#10:   10  1000   1          50      OK
#11:   11  1000   1          50 Discard
#12:   12  1000   1          50 Discard
#13:   13  1000   1          61      OK
#14:   14  1000   1          61      OK
#15:   15  1000   1          61      OK
#16:   16  1000   1          61 Discard
#17:   17  1000   1          61 Discard
#18:   18  1000   1          58      OK
库(data.table)
setDT(df)
df[,,

注释:=ifelse(seq_len(.N)使用
数据。表

library(data.table)
setDT(df)
df[, 
    Comment := ifelse(seq_len(.N) <= 3, 'OK', 'Discard'), 
    .(Store, RTU, rleid(Temperature))
][]
#    Time Store RTU Temperature Comment
# 1:    1  1000   1          54      OK
# 2:    2  1000   1          54      OK
# 3:    3  1000   1          54      OK
# 4:    4  1000   1          54 Discard
# 5:    5  1000   1          54 Discard
# 6:    6  1000   1          56      OK
# 7:    7  1000   1          57      OK
# 8:    8  1000   1          50      OK
# 9:    9  1000   1          50      OK
#10:   10  1000   1          50      OK
#11:   11  1000   1          50 Discard
#12:   12  1000   1          50 Discard
#13:   13  1000   1          61      OK
#14:   14  1000   1          61      OK
#15:   15  1000   1          61      OK
#16:   16  1000   1          61 Discard
#17:   17  1000   1          61 Discard
#18:   18  1000   1          58      OK
库(data.table)
setDT(df)
df[,,

注释:=ifelse(seq_len(.N)我想将前3个连续出现的事件标记为“OK”,4+我想标记为“Discard”。在您的示例中,时间1-3在标志温度检查列中会有“OK”。虽然它对示例数据没有影响,但我怀疑OP需要
分组依据(标志,add=TRUE)
@halfmegle抱歉。问题是我没有使用
行号()
。而是检查了
n()
。我真的很傻。@halfmeggle如果您愿意,您可以删除分析中需要的其他列。我很欣赏创建data.frame的清晰解释和代码。这使事情变得更简单。@halfmeggle让一些聊天信息变得清晰,以供将来的用户使用。谢谢我想将前3个连续出现的事件标记为“OK”和4+我想标记为“Discard”。在您的示例中,时间1-3将在Flag\u Temperature\u Check列中显示“OK”。虽然它对示例数据没有影响,但我怀疑OP需要
group\u by(Flag,add=TRUE)
@halfmeggle抱歉。问题是我没有使用
行数()
。而是检查
n()
。我真的很傻。@halfmeggle如果你愿意,你可以删除分析中需要的其他列。我很欣赏创建data.frame的清晰解释和代码。这使事情变得更简单。@halfmeggle让一些聊天信息变得清晰,以供将来的用户使用。谢谢