R 将前导零添加回ID变量

R 将前导零添加回ID变量,r,R,我正在使用以下ID数据,我正在尝试将数据恢复到正确的形式 “错误ID”的前20个观察结果如下: [1] 11820096867 11820053047 13410057602 13410015341 14257205715 28382012393 13410001306 11820000771 11820000784 11820000884 11820011030 [12] 15230002545 13410015602 17336011108 11820000769 11820096867

我正在使用以下ID数据,我正在尝试将数据恢复到正确的形式

“错误ID”的前20个观察结果如下:

 [1] 11820096867 11820053047 13410057602 13410015341 14257205715 28382012393 13410001306 11820000771 11820000784 11820000884 11820011030
[12] 15230002545 13410015602 17336011108 11820000769 11820096867 11820053030 13410050602 11820053030 14257205715
        S G     V     I
 [91,]  0 1 18200 97341
 [92,]  0 1 71990 15340
 [93,]  0 1 18200 87418
 [94,]  6 1 18200 38602
 [95,] 27 1 34100  1640
 [96,]  0 1 19699 30069
 [97,]  0 2 84694 59574
 [98,]  0 1 71990  1640
 [99,]  0 1 18200   771
[100,]  0 1 18200  1640
该数据可分为4个部分
S
G
V
I

我想把这些前导零加回去,把数据分成4列

S = 2 digits long
G = 1 digit long
V = 5 digits
I = 5 digits
我一直在用这些“不正确的ID”反向工作,因此,例如,观察值
11820000771
将被分成最后5位(减去前导零),并且将是=
I
接下来的5位(减去前导零)将是=V等

例1:

11820000771
将是:

I = 0771
V = 82000
G = 1
S = 1
I = 5715
V = 25720
G = 4
S = 1
I = 15602
V = 4100
G = 3
S = 1
I = 0008
V = 94390
G = 0
S = 1
例2:

14257205715
将是:

I = 0771
V = 82000
G = 1
S = 1
I = 5715
V = 25720
G = 4
S = 1
I = 15602
V = 4100
G = 3
S = 1
I = 0008
V = 94390
G = 0
S = 1
例3:

13410015602
将是:

I = 0771
V = 82000
G = 1
S = 1
I = 5715
V = 25720
G = 4
S = 1
I = 15602
V = 4100
G = 3
S = 1
I = 0008
V = 94390
G = 0
S = 1
例4:

10943900008
将是:

I = 0771
V = 82000
G = 1
S = 1
I = 5715
V = 25720
G = 4
S = 1
I = 15602
V = 4100
G = 3
S = 1
I = 0008
V = 94390
G = 0
S = 1
在文档中,说明“不正确的ID”数据的
前导零未显示
,已被删除

在第二个“正确”数据帧中,这是
S
G
V
I
的外观:

 [1] 11820096867 11820053047 13410057602 13410015341 14257205715 28382012393 13410001306 11820000771 11820000784 11820000884 11820011030
[12] 15230002545 13410015602 17336011108 11820000769 11820096867 11820053030 13410050602 11820053030 14257205715
        S G     V     I
 [91,]  0 1 18200 97341
 [92,]  0 1 71990 15340
 [93,]  0 1 18200 87418
 [94,]  6 1 18200 38602
 [95,] 27 1 34100  1640
 [96,]  0 1 19699 30069
 [97,]  0 2 84694 59574
 [98,]  0 1 71990  1640
 [99,]  0 1 18200   771
[100,]  0 1 18200  1640
所以

第一个目标是将“不正确的ID”分为正确的
s
G
V
I
,与上述类似

第二个目标是创建一个新的ID密钥,如下所示:

 [1] "00-01-73360-50661" "00-01-87692-30040" "00-01-34100-57509" "00-01-18200-53047" "00-03-70310-30703" "00-01-82000-72385"
 [7] "00-01-68213-09410" "00-01-18200-00771" "00-01-34100-50340" "00-03-73360-97341"
其中,
S
G
V
I
通过
-
组合和拆分,并将前导零添加回数据

概述:

我试图将前导零添加回ID变量的段,该变量被拆分为4个最大长度段。如果某个段从
0
开始,则该段将被删除。如果从大于
0
的数字开始,则不会向ID添加前导零

希望我是清楚的,如果我不在任何方面让我知道,我会澄清

数据:

数据:

运行您的版本时,我会得到以下控制台输出:

> df_panel$COLUPC <- gsub("-","",df_panel$UPC)
> df_panel$COLUPC <- sub("^[0]+", "", df_panel$COLUPC) 
> beer_PANEL_GR$COLUPCmatch <- beer_PANEL_GR$COLUPC %in% df_panel$COLUPC
> sum(beer_PANEL_GR$COLUPCmatch == FALSE) 
[1] 896
> sum(beer_PANEL_GR$COLUPCmatch == TRUE) 
[1] 19119
> 
> beer_PANEL_GR$COLUPC <- as.character(beer_PANEL_GR$COLUPC)
> df <- full_join(df_panel, beer_PANEL_GR, by = "COLUPC") #Joining with UPC causes us to lose a lot of observations
> dim(df)
[1] 5293488      40
> # remove 0s at the beginning of the string, or preceded by "-"
> df_panel$COLUPC <- gsub("(?<=^|-)0","", df_panel$UPC, perl = TRUE)
>   
>   # remove dashes
> df_panel$COLUPC <- gsub("-", "", df_panel$COLUPC)
>   # remove leading zeros
> df_panel$COLUPC <- gsub("^0+", "", df_panel$COLUPC)
> 
> beer_PANEL_GR$COLUPCmatch <- beer_PANEL_GR$COLUPC %in% df_panel$COLUPC
> sum(beer_PANEL_GR$COLUPCmatch == FALSE) 
[1] 7382
> sum(beer_PANEL_GR$COLUPCmatch == TRUE) 
[1] 12633
> 
> df2 <- full_join(df_panel, beer_PANEL_GR, by = "COLUPC") 
> dim(df2)
[1] 3564132      40
#删除字符串开头的0,或前面加“-”
>df_面板$COLUPC
>#删除破折号
>df_面板$COLUPC#删除前导零
>df_面板$COLUPC
>beer\U PANEL\U GR$COLUPCmatch sum(beer\U PANEL\U GR$COLUPCmatch==FALSE)
[1] 7382
>总和(啤酒\u面板\u GR$COLUPCmatch==真)
[1] 12633
> 
>df2 dim(df2)
[1] 3564132      40

解决您的编辑问题,如何:

library(dplyr)

# remove 0s at the beginning of the string, or preceded by "-"
gsub("(?<=^|-)0","", IDs, perl = TRUE) %>% 

  # remove dashes
  gsub("-", "", .) %>% 
  # remove leading zeros
  gsub("^0+", "", .)

[1] "1418270712"  "1523001540"  "1182000987"  "1838207131"  "1341001222" 
[6] "13410050602"
库(dplyr)
#删除字符串开头的0,或以“-”开头的0

gsub(“我不清楚这怎么不是我上周回答的你的问题的重复。我没有看到关于我们可以决定哪些数字属于这个问题的哪个部分的算法的任何新信息ID@user113156如果每个组件上的前导零都被单独删除,为什么不能是I=05602,V=41001,G=0,S=13?@Frank在例3中说出了我的话。user113156,您提供的信息并不能消除需要添加零的地方的模糊性。我们可以像在我对上一个问题的回答中那样遵循固定模式,但事实仍然是,零可以出现在例3的
I
V
中这取决于您使用这些数据的目的,但是如果您不尝试重新构建ID,而只是从“正确”字段中去掉前导零,会怎么样"数据与不正确的数据相匹配。您必须在前后检查重复项,以查看ID是否足够唯一,以确保它们在没有前导零的情况下仍然是唯一的。好的,我认为前导零问题已得到解决。我将用我发现的所有内容更新我的原始问题。它看起来比我最初想到的要简单得多g!我已经更新了编辑3下的原始帖子。我现在相信问题更简单了。是的,我有类似的
df_panel$COLUPC来复制您的数据,
sub(“^[0]+”,”,df_panel$COLUPC)
是不够的,因为它不会删除每个ID中的前导零。要做到这一点,您需要在我的第一条语句中使用积极的后视。您不应该从操作中获得不同的行计数。替换操作不应该更改
nrow(df_面板)