R语言inner_join合并字符列报错,如何将同一数据框两字符列合并为一列?
解决方法
首先明确报错原因:inner_join()和left_join()是用来合并两个数据框的函数,你直接传入data1$Type.1、data1$Type.2这类字符向量,自然会触发类型不匹配的报错。要合并同一数据框内的两列,得根据你的实际需求选择对应方法:
情况1:每行的两列内容合并为单个字符串
如果想把每行的Type.1和Type.2用分隔符拼接(比如“草/毒”),同时处理Type.2的空值,推荐用stringr包的str_c(自动忽略NA):
library(dplyr) library(stringr) # 在原数据框新增合并后的列 data1 <- data1 %>% mutate(Type_combined = str_c(Type.1, Type.2, sep = "/", na.rm = TRUE))
如果不想额外加载stringr,用基础R的paste也能实现,只需先把NA替换为空字符串:
library(dplyr) data1 <- data1 %>% mutate(Type_combined = paste( ifelse(is.na(Type.1), "", Type.1), ifelse(is.na(Type.2), "", Type.2), sep = "/" )) %>% # 去掉单列为空时产生的多余分隔符 mutate(Type_combined = gsub("^/|/$", "", Type_combined))
情况2:把两列的所有值堆叠成一列
如果想把Type.1和Type.2的所有元素合并成一个单独的列(比如统计所有出现过的类型),用tidyr的pivot_longer最方便:
library(dplyr) library(tidyr) # 生成仅包含合并后类型的数据集,自动过滤空值 type_united <- data1 %>% select(Type.1, Type.2) %>% pivot_longer( cols = everything(), names_to = NULL, # 不需要保留原列名 values_to = "Type" ) %>% filter(!is.na(Type))
如果只需要一个纯向量,用基础R的c()就能快速实现:
# 合并两列向量 type_united <- c(data1$Type.1, data1$Type.2) # 去掉空值 type_united <- type_united[!is.na(type_united)] # 可选:去重 type_united <- unique(type_united)
内容的提问来源于stack exchange,提问作者Lucas K
相关产品推荐
相关产品推荐

