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
让我们以ID3989
为例:它出现在2019-08-14
报告中,缺少以下两个报告,然后从2019-09-04
开始出现在报告中
具体而言,我需要的是,对于每一行:
1,0,1
类型的序列(其中1之间可以有任意数量的零)1
分配给找到的任何中间零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