Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 添加符合特定条件的计数器_R_Row_Counter - Fatal编程技术网

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
  • 计数器必须在满足条件行中的2个值之后开始递增
  • 计数时间
    必须包含序列发生的时间数(满足条件的数据点序列)
  • 具有预期输出的数据帧

    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  
    
  • 行号3满足条件,
    计数器
    未初始化,但
    计数器时间
    已增加
  • 计数器
    已从第5行开始(根据条件,满足条件值的前2行不应触发计数器)
  • 第8行中的计数器返回到0,并且
    计数器时间保持不变
  • 同样,由于不考虑第10行和第11行,
    计数器从第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
    中的组都有