R 添加符合特定条件的计数器
问题陈述R 添加符合特定条件的计数器,r,row,counter,R,Row,Counter,问题陈述 Column1 Column2 Counter Counter_Time 1.1254 2.784 0 0 4.678 7.985 0 0 8.89 0 0 1 7.65 0 0 1 3.54 0 1 1 4.32 0 2 1 9.83 0 3 1 3.
Column1 Column2 Counter Counter_Time
1.1254 2.784 0 0
4.678 7.985 0 0
8.89 0 0 1
7.65 0 0 1
3.54 0 1 1
4.32 0 2 1
9.83 0 3 1
3.86 4.3 0 1
5.63 9.8 0 1
4.53 0 0 2
6.83 0 0 2
3.431 0 4 2
8.976 0 5 2
9.864 0 6 2
7.3 9.2 0 2
2.3 3.2 0 2
4.3 0 0 3
2.1 0 0 3
4.32 0 7 3
给定以下数据集,该数据集有两列Column1
和column2
,再添加两列Counter
和Counting time
。初始化计数器
和计数器时间
的条件如下:
Column1>1
和Column2=0
计数时间
必须包含序列发生的时间数(满足条件的数据点序列)Column1 Column2 Counter Counter_Time
1.1254 2.784 0 0
4.678 7.985 0 0
8.89 0 0 1
7.65 0 0 1
3.54 0 1 1
4.32 0 2 1
9.83 0 3 1
3.86 4.3 0 1
5.63 9.8 0 1
4.53 0 0 2
6.83 0 0 2
3.431 0 4 2
8.976 0 5 2
9.864 0 6 2
7.3 9.2 0 2
2.3 3.2 0 2
4.3 0 0 3
2.1 0 0 3
4.32 0 7 3
我遇到了类似的问题,得到了关于如何增加计数器的答案,但我不能满足上述条件。请注意,计数器应在满足条件的两行之后启动
从数据集观察到的结果
Column1 Column2 Counter Counter_Time
1.1254 2.784 0 0
4.678 7.985 0 0
8.89 0 0 1
7.65 0 0 1
3.54 0 1 1
4.32 0 2 1
9.83 0 3 1
3.86 4.3 0 1
5.63 9.8 0 1
4.53 0 0 2
6.83 0 0 2
3.431 0 4 2
8.976 0 5 2
9.864 0 6 2
7.3 9.2 0 2
2.3 3.2 0 2
4.3 0 0 3
2.1 0 0 3
4.32 0 7 3
计数器
未初始化,但计数器时间
已增加计数器
已从第5行开始(根据条件,满足条件值的前2行不应触发计数器)计数器时间保持不变
计数器从第12行开始递增。但是计数器时间在第10行增加
我已经详细阐述了问题陈述,以便专家清楚地知道如何提供准确的解决方案 具有
数据的紧凑解决方案。表
(使用与@ycw相同的数据):
# Load packages
library(tidyverse)
library(data.table)
# Create example data frame
dt <- fread("Column1 Column2
1.1254 2.784
4.678 7.985
8.89 0
7.65 0
3.54 0
4.32 0
9.83 0
3.86 4.3
5.63 9.8
4.53 0
6.83 0
3.431 0
8.976 0
9.864 0
7.3 9.2
2.3 3.2
4.3 0
2.1 0
4.32 0 ")
### Create Counter_Time
dt2 <- dt %>%
mutate(Merge_ID = 1:n()) %>%
mutate(Condition = ifelse(Column1 > 1 & Column2 == 0, 1, 0)) %>%
mutate(ID = rleid(Condition)) %>%
mutate(Counter_Time = ifelse(Condition == 0, (ID - 1)/2, ID/2))
### Create Counter
dt3 <- dt2 %>%
group_by(Counter_Time) %>%
slice(3:n()) %>%
filter(Condition == 1) %>%
ungroup() %>%
mutate(Counter = 1:n()) %>%
select(Merge_ID, Counter)
### Merge dt2 and dt3 together, dt4 is the final output
dt4 <- dt2 %>%
left_join(dt3, by = "Merge_ID") %>%
mutate(Counter = ifelse(is.na(Counter), 0, Counter)) %>%
select(Column1, Column2, Counter, Counter_Time)
其中:
> dt
Column1 Column2 counter counter_time
1: 1.1254 2.784 0 0
2: 4.6780 7.985 0 0
3: 8.8900 0.000 0 1
4: 7.6500 0.000 0 1
5: 3.5400 0.000 1 1
6: 4.3200 0.000 2 1
7: 9.8300 0.000 3 1
8: 3.8600 4.300 0 1
9: 5.6300 9.800 0 1
10: 4.5300 0.000 0 2
11: 6.8300 0.000 0 2
12: 3.4310 0.000 4 2
13: 8.9760 0.000 5 2
14: 9.8640 0.000 6 2
15: 7.3000 9.200 0 2
16: 2.3000 3.200 0 2
17: 4.3000 0.000 0 3
18: 2.1000 0.000 0 3
19: 4.3200 0.000 7 3
已用数据:
library(data.table)
dt <- fread("Column1 Column2
1.1254 2.784
4.678 7.985
8.89 0
7.65 0
3.54 0
4.32 0
9.83 0
3.86 4.3
5.63 9.8
4.53 0
6.83 0
3.431 0
8.976 0
9.864 0
7.3 9.2
2.3 3.2
4.3 0
2.1 0
4.32 0")
库(data.table)
dt一个包含数据的紧凑解决方案。表
(使用与@ycw相同的数据):
其中:
> dt
Column1 Column2 counter counter_time
1: 1.1254 2.784 0 0
2: 4.6780 7.985 0 0
3: 8.8900 0.000 0 1
4: 7.6500 0.000 0 1
5: 3.5400 0.000 1 1
6: 4.3200 0.000 2 1
7: 9.8300 0.000 3 1
8: 3.8600 4.300 0 1
9: 5.6300 9.800 0 1
10: 4.5300 0.000 0 2
11: 6.8300 0.000 0 2
12: 3.4310 0.000 4 2
13: 8.9760 0.000 5 2
14: 9.8640 0.000 6 2
15: 7.3000 9.200 0 2
16: 2.3000 3.200 0 2
17: 4.3000 0.000 0 3
18: 2.1000 0.000 0 3
19: 4.3200 0.000 7 3
已用数据:
library(data.table)
dt <- fread("Column1 Column2
1.1254 2.784
4.678 7.985
8.89 0
7.65 0
3.54 0
4.32 0
9.83 0
3.86 4.3
5.63 9.8
4.53 0
6.83 0
3.431 0
8.976 0
9.864 0
7.3 9.2
2.3 3.2
4.3 0
2.1 0
4.32 0")
库(data.table)
这是家庭作业问题吗?您仔细考虑了这个问题,这很好,但是SO上的人不应该为您做作业。@Marius不,这是我车辆预测项目工作的一部分,这只是一个样本数据框,但我的实际数据约为500K值,我知道这可以用for循环来实现,但我从一篇类似的帖子中了解到,for循环在R中速度较慢。因此,我想向专家咨询逻辑和优化脚本,以便我能够改进。@Marius尊敬的先生/女士,如果你认为这是一种给孩子们做家庭作业的初级问题,那么这就是我的请求,请告诉我解决方法。我承认我是R编程的初学者,我从过去几天开始用R编程,我认为向专家寻求指导是正确的。我并不是说这是一个初学者水平的问题,你的问题只是措辞有点像家庭作业问题(我很高兴地承认这不是)。不管你是不是初学者,寻求帮助都可以。这是家庭作业问题吗?您仔细考虑了这个问题,这很好,但是SO上的人不应该为您做作业。@Marius不,这是我车辆预测项目工作的一部分,这只是一个样本数据框,但我的实际数据约为500K值,我知道这可以用for循环来实现,但我从一篇类似的帖子中了解到,for循环在R中速度较慢。因此,我想向专家咨询逻辑和优化脚本,以便我能够改进。@Marius尊敬的先生/女士,如果你认为这是一种给孩子们做家庭作业的初级问题,那么这就是我的请求,请告诉我解决方法。我承认我是R编程的初学者,我从过去几天开始用R编程,我认为向专家寻求指导是正确的。我并不是说这是一个初学者水平的问题,你的问题只是措辞有点像家庭作业问题(我很高兴地承认这不是)。无论您是否是初学者,请求帮助都可以。如果我想将切片值增加到800或以上,程序失败,请您解释原因。我请求解释的原因是,根据我的理解,slice
的值将给出不需要考虑的行数(参考:上述问题的条件2),此值将由以前脚本中的另一个变量给出。您的解释将有助于代码的进一步开发。@Tareva我想不是所有Counter_Time
中的组都有超过800
的记录,因此程序失败。那么,您是否建议任何解决方法?因为在最后的R脚本中de>Slice
值和数据集中的记录数将作为变量输入,即计数器时间中的组数和Slice
值本质上不会是静态的。@Tareva我不清楚此时您的预期输出是什么。如果其中一个组条件小于800,计数器
会变成全部吗0
对于该组?如果我想增加切片值,如800及以上,程序失败,请解释原因。我要求解释的原因是,根据我的理解,slice
的值将给出不考虑的行数(参考:上述问题的条件2),该值将由前面脚本中的另一个变量给出。您的解释将有助于代码的进一步开发。@Tareva我想不是所有Counter\u Time
中的组都有