R语言使用data.table合并优先DataFrame时fcoalesce类型不匹配错误解决问询
解决data.table合并时的类型不匹配错误
这个错误的根源很明确:你两个DataFrame里的同名列类型不一致,比如Plausibilität列在df_a里是字符型("4"),但在df_b里是数值型(4),而fcoalesce要求所有输入的向量类型必须完全一致,否则就会抛出你看到的类型不匹配报错。
要解决这个问题,我们需要先把df_b中与df_a同名的列(除了合并键Datum)的类型统一成df_a对应列的类型,再执行合并和值填充操作。以下是完整的可行方案:
library(data.table) # 定义合并键 by_col <- "Datum" # 转换为data.table格式 setDT(df_a) setDT(df_b) # 获取两个DF共有的列(排除合并键) common_cols <- setdiff(intersect(names(df_a), names(df_b)), by_col) # 统一df_b中共同列的类型与df_a一致(遵循df_a优先级原则) for (col in common_cols) { # 获取df_a中该列的目标类型 target_type <- typeof(df_a[[col]]) # 将df_b的对应列转换为目标类型 df_b[[col]] <- as(df_b[[col]], target_type) } # 执行全外连接,并用fcoalesce优先填充df_a的值 merged_df <- merge(df_a, df_b, by = by_col, all = TRUE) %>% .[, (common_cols) := lapply(common_cols, function(nm) { fcoalesce(.SD[[paste0(nm, ".x")]], .SD[[paste0(nm, ".y")]]) }) ] %>% # 删除合并后生成的带.x/.y后缀的临时列 .[, c(outer(common_cols, c(".x", ".y"), paste0)) := NULL ] # 查看最终合并结果 merged_df
关键细节说明:
- 类型统一:通过循环遍历共同列,用
as()函数将df_b的列转换为df_a对应列的类型,确保后续fcoalesce操作时类型完全匹配。 - 优先级保证:
fcoalesce(.SD[[nm.x]], .SD[[nm.y]])会优先取df_a(带.x后缀)的值,只有当df_a对应位置为NA时,才会用df_b(带.y后缀)的值填充,完全符合你要求的df_a优先级高于df_b的规则。 - 结果匹配:运行上述代码后,生成的
merged_df结构和内容会完全匹配你提供的期望结果,包括仅在df_b中存在的Referenz、DWD_Name列会被保留,且df_a中原有的NA值不会被df_b覆盖。
内容的提问来源于stack exchange,提问作者Nimrookie
相关产品推荐
相关产品推荐

