如何将字符添加到不同大小的字符串中,以准备通过 left_join 连接数据帧?
How to add characters to strings of differing sizes in preparation for joining data frames via left_join?
我有一个名为 help.a
的基本 df,我正在尝试加入 help.b
,但是,当我读入 help.b
时,id 变量是数字而不是相同的 length/format作为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 不匹配,它无法加入:
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.b
并将 id 更改为一个字符,然后为每个 id 添加“0”,但所有字符的长度都需要等于 5 个字符...例如,第 1 行需要四个“0”,第 2 行需要三个“0”。这样 left_join 就会注意到匹配的字符串并适当地加入。
非常感谢任何帮助。
这里的一个选项是简单地将 help.a$id
列转换为数字,然后在 LEFT JOIN
模式下使用 baseR merge()
函数 (all.x=TRUE
):
> 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
数据框中创建它的副本,例如
help.a$id_orig <- help.a$id
在将 help.a$id
转换为数字之前执行此操作。
你好像在找sprintf
:
help.b$id <- sprintf("%05d", help.b$id)
使用 d
表示您想要格式化整数,使用 05
表示您希望结果数字为 5 个字符宽并用零填充。
从评论看来 help.b$id
是一个字符列。在那种情况下,取决于平台(在 linux 上这不起作用;sprintf
的帮助过滤器没有说明这在哪个平台上有效),您可以使用
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)
我有一个名为 help.a
的基本 df,我正在尝试加入 help.b
,但是,当我读入 help.b
时,id 变量是数字而不是相同的 length/format作为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 不匹配,它无法加入:
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.b
并将 id 更改为一个字符,然后为每个 id 添加“0”,但所有字符的长度都需要等于 5 个字符...例如,第 1 行需要四个“0”,第 2 行需要三个“0”。这样 left_join 就会注意到匹配的字符串并适当地加入。
非常感谢任何帮助。
这里的一个选项是简单地将 help.a$id
列转换为数字,然后在 LEFT JOIN
模式下使用 baseR merge()
函数 (all.x=TRUE
):
> 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
数据框中创建它的副本,例如
help.a$id_orig <- help.a$id
在将 help.a$id
转换为数字之前执行此操作。
你好像在找sprintf
:
help.b$id <- sprintf("%05d", help.b$id)
使用 d
表示您想要格式化整数,使用 05
表示您希望结果数字为 5 个字符宽并用零填充。
从评论看来 help.b$id
是一个字符列。在那种情况下,取决于平台(在 linux 上这不起作用;sprintf
的帮助过滤器没有说明这在哪个平台上有效),您可以使用
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)