R语言为单数字补前导零 实现两数据框按双列组合ID关联
代码问题与解决方法
原代码存在的问题
- 管道符
%>%无法直接接基础if控制流语句:dplyr管道传递的是数据框对象,基础if无法直接处理该输入,行级条件判断需要使用if_else()、case_when()这类dplyr内置的向量化判断函数。 - 逻辑方向错误:你需要先补全
v1的前导零再拼接生成idvar,而非拼接后再做字符串截断,且你写的regexpr(" O", .$idvar)检索的内容在字符串中不存在,完全无法匹配到目标内容。 - 缺失df2的
idvar字段:你仅为df1生成了关联用的idvar,df2没有同名字段的情况下,关联操作无法执行。 - 补充:你给出的示例数据定义存在语法错误,第二列未指定列名,需要补充
v2列名才能正常运行。
正确实现代码
首先修正示例数据:
library(tidyverse) df1 <- tibble(v1 = c('1', '2', '3', '4', '5', '6'), v2 = c('20', '22', '24', '26', '28', '30')) df2 <- tibble(v1 = c('01', '02', '03', '04', '05', '06'), v2 = c('20', '22', '24', '26', '28', '30'))
方法1:先生成统一规则的idvar再关联
用str_pad()给df1的v1补前导零到2位,对齐df2的v1格式后拼接生成idvar:
# 处理df1的idvar df1 <- df1 %>% mutate(idvar = str_c(str_pad(v1, width = 2, side = "left", pad = "0"), ".", v2)) # 处理df2的idvar df2 <- df2 %>% mutate(idvar = str_c(v1, ".", v2)) # 执行左连接 result <- df1 %>% left_join(df2, by = "idvar")
方法2:无需新增字段,直接多列关联
你也可以不生成idvar,直接在关联时处理v1的格式,代码更简洁:
# 补全df1的v1前导零匹配df2的v1 result <- df1 %>% left_join(df2, by = "v2", join_by(str_pad(v1.x, 2, "left", "0") == v1.y)) # 或去掉df2的v1前导零匹配df1的v1 result <- df1 %>% left_join(df2, by = "v2", join_by(v1.x == str_remove(v1.y, "^0+")))
内容的提问来源于stack exchange,提问作者C.Robin
相关产品推荐
相关产品推荐

