Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.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 如果存在“0”,则将TIBLE单元格的值设置为1;随函附上;列中的_R_Dplyr_Tidyr_Tibble - Fatal编程技术网

R 如果存在“0”,则将TIBLE单元格的值设置为1;随函附上;列中的

R 如果存在“0”,则将TIBLE单元格的值设置为1;随函附上;列中的,r,dplyr,tidyr,tibble,R,Dplyr,Tidyr,Tibble,我正在编写一个报告,它从一些文件中获取数据,生成一个透视表,并计算在某个时间段哪个id处于“活动”状态。但是,我在一些源文件中发现了丢失数据的问题,我需要修复它 用一个例子更容易解释这一点: 所有文件都导入到一个TIBLE中,如下所示: df.data %>% head() ### A tibble: 6 x 2 ## ID REPORT_DATE ## <chr> <date> ##1 9495 2019-08-14 ##2

我正在编写一个报告,它从一些文件中获取数据,生成一个透视表,并计算在某个时间段哪个
id
处于“活动”状态。但是,我在一些源文件中发现了丢失数据的问题,我需要修复它

用一个例子更容易解释这一点:

所有文件都导入到一个TIBLE中,如下所示:

df.data %>% head()

### A tibble: 6 x 2
##  ID     REPORT_DATE
##  <chr>  <date>       
##1 9495   2019-08-14   
##2 1678   2019-08-14   
##3 0944   2019-08-14   
##4 6046   2019-08-14   
##5 7758   2019-08-14   
##6 2403   2019-08-14   
df.pivot <- df.data %>% select(ID, REPORT_DATE) %>% 
  mutate(IN_REPORT=1) %>% arrange(ID, REPORT_DATE) %>% 
  spread(REPORT_DATE, IN_REPORT, fill=0) %>% head()

print(df.pivot %>% head)

### A tibble: 6 x 8
##  ID     `2019-08-14` `2019-08-21` `2019-08-28` `2019-09-04` `2019-09-11` `2019-09-18` `2019-09-25`
##  <chr>        <dbl>        <dbl>        <dbl>        <dbl>        <dbl>        <dbl>        <dbl>
##1 8123            1            1            1            1            1            1            1
##2 0236            1            1            1            1            1            1            1
##3 0624            1            1            1            1            1            1            1
##4 1278            1            1            1            1            1            1            1
##5 2870            1            1            1            0            0            0            0
##6 5469            1            1            1            1            1            1            1
print(df.pivot %>% 
  filter(ID %in% c('3989', '4188', '9941', '8996')))

### A tibble: 4 x 8
##  ID    `2019-08-14` `2019-08-21` `2019-08-28` `2019-09-04` `2019-09-11` `2019-09-18` `2019-09-25`
##  <chr>        <dbl>        <dbl>        <dbl>        <dbl>        <dbl>        <dbl>        <dbl>
##1 4188             1            1            0            0            1            1            1
##2 9941             1            1            1            0            1            1            1
##3 3989             1            0            0            1            1            1            1
##4 8996             1            1            1            0            0            0            1
让我们以ID
3989
为例:它出现在
2019-08-14
报告中,缺少以下两个报告,然后从
2019-09-04
开始出现在报告中

具体而言,我需要的是,对于每一行:

  • 检查是否存在
    1,0,1
    类型的序列(其中1之间可以有任意数量的零)
  • 将值
    1
    分配给找到的任何中间零
  • 我已经成功地找到了使用此方法时出现问题的ID(可能不是一个优雅的解决方案,但我认为它是有效的):

    df.ids\u与\u问题%select(ICCID)
    if(is.null(df.ids_带有_问题)){
    df.ids_与_发布模拟数据
    
    #数据帧
    #一个tibble:7x8
    ID`2019-08-14``2019-08-21``2019-08-28``2019-09-04``2019-09-11``2019-09-18``2019-09-25`
    1  4188            1            1            0            0            1            1            1
    2  9941            1            1            1            0            1            1            1
    3  3989            1            0            0            1            1            1            1
    4  8996            1            1            1            0            0            0            1
    5  1234            1            1            1            1            1            1            1
    6  2345            1            1            1            1            1            0            0
    7  2345            0            0            1            1            1            0            0
    
    定义函数 定义fcutnion的棘手部分是将模式
    1,…,1
    (其中
    应为任何长度的0)转换为所有1(
    1,…,1

    rle
    在这种情况下似乎很有用


    replace\u pattern\u 101谢谢,但它不起作用。当我使用您的示例一步一步地执行此操作时,
    match\u index
    变量的
    值为空,因此,
    长度(match\u index)
    返回零。如果找不到匹配项,则应为0。在这种情况下,将返回原始向量。您可以粘贴此函数不适用的数据行吗?我将在我的问题中发布相关的代码片段…请稍等片刻。我想我已经发现问题,模式必须是
    c(1,0,1)
    ,而不是
    c(1L,0L,1L)
    。我正在测试它。您可以将数据帧中的数字列强制为整数列吗?因为,即使值看起来像1,0,它们的类型实际上是双精度的。在某些情况下,
    1==1L
    可能是
    FALSE
    df.ids_with_issues <- NULL
    
    for(t in 2:(ncol(df.pivot)-1)) {
      df.temp <- df.pivot %>% 
        filter(
          .[t]==1, 
          .[t+1]==0,
          pmap_dbl(.[(t+1):ncol(df.pivot)], max)==1
        ) %>% select(ICCID)
      if(is.null(df.ids_with_issues)) {
        df.ids_with_issues <- df.temp
      } else {
        df.ids_with_issues <- df.ids_with_issues %>% union(df.temp)
      }
    }
    
    print(df.ids_with_issues)
    
    ### A tibble: 4 x 1
    ##  ICCID              
    ##  <chr>              
    ##1 3989
    ##2 4188
    ##3 9941
    ##4 8996
    
    > replace_pattern_101(c(0,0,1,1,0,0,0,1,0,1,0,0))
    > [1] 0 0 1 1 1 1 1 1 1 1 0 0