R语言中基于多列(含名字前两位)的left_join报错求助
解决基于名字缩写、姓氏和年份的左连接问题
我明白你想基于名字前两个字符、姓氏和年份做左连接的需求,之前的写法出错是因为left_join的by参数不能直接放函数计算式——它需要的是列名对应关系,而不是直接计算结果。下面给你两种可行的解决办法:
方法1:提前生成缩写列(直观易调试)
最稳妥的方式是先在两个数据框里都生成一个存储名字前两个字符的新列,再用这个新列做连接。这样你还能方便检查缩写是否正确,避免后续排查问题:
library(dplyr) # 给左表添加名字缩写列 names_df <- names_df %>% mutate(first_name_abbr = substr(first_name, 1, 2)) # 给右表添加相同的名字缩写列 values_df <- values_df %>% mutate(first_name_abbr = substr(first_name, 1, 2)) # 基于新列+姓氏+年份做左连接 newly_joined_df <- names_df %>% left_join(values_df, by = c("first_name_abbr", "last_name", "year"))
方法2:直接在连接条件中计算(无需修改原数据)
如果你不想修改原数据框,可以用dplyr 1.1.0及以上版本支持的join_by()函数,直接在连接条件里写计算逻辑。这里x代表左表(names_df),y代表右表(values_df):
library(dplyr) newly_joined_df <- names_df %>% left_join(values_df, by = join_by( substr(x$first_name, 1, 2) == substr(y$first_name, 1, 2), last_name == last_name, year == year ))
为什么之前的写法会报错?
- 第一种写法
by = c(substr("first_name", 1, 2), ...)里,substr的参数是字符串"first_name",不是数据框的列,所以会返回固定字符串"fi",R会尝试找名为"fi"的列,自然不存在,触发错误。 - 第二种写法
substr(names_df$first_name, 1, 2)生成的是一个向量,但by参数需要的是列名的对应规则,不是具体的数值向量,因此也不符合要求。
内容的提问来源于stack exchange,提问作者Luke Steer




