Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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 如何将字符添加到不同大小的字符串中,以便通过left_join连接数据帧?_R_Dplyr_Gsub - Fatal编程技术网

R 如何将字符添加到不同大小的字符串中,以便通过left_join连接数据帧?

R 如何将字符添加到不同大小的字符串中,以便通过left_join连接数据帧?,r,dplyr,gsub,R,Dplyr,Gsub,我有一个名为help.a的基本df,我正在尝试加入help.b,但是,当我在help.b中读取id变量时,它是数字的,并且与help.a中的id变量的长度/格式不同。我试图坚持使用字符变量,因为当因子的级别不同时,left_join会将它们更改为字符 help.a <- data.frame(id = as.character(c("00005", "00010", "00010", "00010", "00025", "00025", "00324", "00324")),

我有一个名为help.a的基本df,我正在尝试加入help.b,但是,当我在help.b中读取id变量时,它是数字的,并且与help.a中的id变量的长度/格式不同。我试图坚持使用字符变量,因为当因子的级别不同时,left_join会将它们更改为字符

help.a <- data.frame(id = as.character(c("00005", "00010", "00010", "00010", "00025", "00025", "00324", "00324")),
                       var_a = c(NA, 2, 2, 2, NA, NA, NA, NA),
                       var_b = c(4, NA, NA, 4, 4, 4, NA, NA))

help.b <- data.frame(id = c(5, 10, 324),
                         var_c = c(2, 2, 2),
                         var_d = c(4, NA, 6))
我想我需要做的是阅读help.b,将id改为一个字符,然后在每个id中添加0,但所有id的长度都必须等于5个字符。。。e、 例如,第1行需要四个0,第2行需要三个0。这样,左连接将注意到匹配的字符串并进行适当的连接


非常感谢您的帮助

这里的一个选项是简单地将help.a$id列转换为numeric,然后在左连接模式下使用baseR merge函数all.x=TRUE:


在将help.a$id转换为数值之前请执行此操作。

这里的一个选项是将help.a$id列转换为数值,然后在左连接模式下使用baseR merge函数all.x=TRUE:


在将help.a$id转换为数字之前,请执行此操作。

看起来您正在寻找sprintf:

或者


看起来您正在寻找sprintf:

或者


我正在处理的数据集有100000多行,当我切换到数字时,会发生一些奇怪的事情。除此之外,我希望在脚本中保留因子/字符格式的变量,以便将来进行操作。然后创建列的备份,并将其称为help。a$orig_id。什么是扭曲的意思?我认为通过字符将单个列转换为数字没有问题。好问题:我有额外的dfs要合并到主df中,并且似乎有几千个额外的重复观测值。我可以尝试诊断该问题并使用数字路由。因此,在这种情况下,该列的备份将允许我与数字列进行比较?感谢您的帮助。我正在处理的数据集有100000多行,当我切换到数字时,会发生一些奇怪的事情。除此之外,我希望在脚本中保留因子/字符格式的变量,以便将来进行操作。然后创建列的备份,并将其称为help。a$orig_id。什么是扭曲的意思?我认为通过字符将单个列转换为数字没有问题。好问题:我有额外的dfs要合并到主df中,并且似乎有几千个额外的重复观测值。我可以尝试诊断该问题并使用数字路由。因此,在这种情况下,该列的备份将允许我与数字列进行比较?谢谢您的帮助。我想将0添加到帮助中。b尽管如此。。。当我使用这个命令时,我得到一个错误,说“sprintf%05d中的错误,help.b$id:无效格式'%05d';对角色对象使用格式%s,当我运行上述命令时。。。它将id更改为顺序00001、00002、00002、00002、00003等。好的,帮助。一个$id是一个因素。这也可能意味着它包含的值不是数字。尝试将%05d更改为%05s。正确。。。对不起,我把答案中的help.b和help.a弄混了。这一点现在得到纠正。使用%05s的解决方案似乎无法在所有平台上运行。我还添加了一个可以在所有平台上运行的解决方案。我想将0添加到帮助中。不过。。。当我使用这个命令时,我得到一个错误,说“sprintf%05d中的错误,help.b$id:无效格式'%05d';对角色对象使用格式%s,当我运行上述命令时。。。它将id更改为顺序00001、00002、00002、00002、00003等。好的,帮助。一个$id是一个因素。这也可能意味着它包含的值不是数字。尝试将%05d更改为%05s。正确。。。对不起,我把答案中的help.b和help.a弄混了。这一点现在得到纠正。使用%05s的解决方案似乎无法在所有平台上运行。我还添加了一个可以在所有平台上运行的解决方案。
help.b$id <- as.character(help.b$id)
left_join(help.a, help.b)

     id var_a var_b var_c var_d
1 00005    NA     4    NA    NA
2 00010     2    NA    NA    NA
3 00010     2    NA    NA    NA
4 00010     2     4    NA    NA
5 00025    NA     4    NA    NA
6 00025    NA     4    NA    NA
7 00324    NA    NA    NA    NA
8 00324    NA    NA    NA    NA
     id var_a var_b var_c var_d
1 00005    NA     4     2     4
2 00010     2    NA     2    NA
3 00010     2    NA     2    NA
4 00010     2     4     2    NA
5 00025    NA     4    NA    NA
6 00025    NA     4    NA    NA
7 00324    NA    NA     2     6
8 00324    NA    NA     2     6
> help.a$id <- as.numeric(as.character(help.a$id))

> merge(help.a, help.b, by="id", all.x=TRUE)
   id var_a var_b var_c var_d
1   5    NA     4     2     4
2  10     2    NA     2    NA
3  10     2    NA     2    NA
4  10     2     4     2    NA
5  25    NA     4    NA    NA
6  25    NA     4    NA    NA
7 324    NA    NA     2     6
8 324    NA    NA     2     6
help.a$id_orig <- help.a$id
help.b$id <- sprintf("%05d", help.b$id)
help.b$id <- sprintf("%05s", help.b$id)
# When help.b$id is a character use
id <- as.numeric(help.b$id)
# When help.b$id is a factor use
id <- as.numeric(as.character(help.b$id))

# Just to make sure check the conversion went ok; should return empty vector and
# if not the values for which the conversion went wrong.
help.b$id[as.character(id) != help.b$id]

help.b$id <- sprintf("%05d", id)