如何在R中将数据框的多个TagNo列合并为单一列?
解决方案
方法一:使用dplyr的coalesce函数(推荐)
利用coalesce()函数逐行提取第一个非NA值,高效合并所有TagNo列:
library(dplyr) # 合并所有TagNo列为单一列 df_final <- dfmerge %>% # 提取所有TagNo相关列,取第一个非NA值作为新的TagNo mutate(TagNo = coalesce(!!!select(., starts_with("TagNo")))) %>% # 删除原来的多个TagNo列 select(-starts_with("TagNo")) %>% # 将TagNo列移到ID列之后 relocate(TagNo, .after = ID)
方法二:Base R实现
如果不想依赖dplyr,也可以用base R的apply()函数处理:
# 提取所有TagNo列的列索引 tag_cols <- grepl("TagNo", colnames(dfmerge)) # 逐行取第一个非NA值作为新TagNo dfmerge$TagNo <- apply(dfmerge[, tag_cols], 1, function(x) x[!is.na(x)][1]) # 删除原有的多个TagNo列 dfmerge <- dfmerge[, !tag_cols | colnames(dfmerge) == "TagNo"] # 调整列顺序,将TagNo放在ID之后 dfmerge <- dfmerge[, c("ID", "TagNo", setdiff(colnames(dfmerge), c("ID", "TagNo")))]
结果说明
两种方法都会得到你期望的结果:每个ID对应唯一的TagNo列,保留所有Info相关列,列顺序符合要求。因为你提到每个ID的TagNo值始终一致,所以不用担心取到不同值的问题。
内容的提问来源于stack exchange,提问作者user20330606
相关产品推荐
相关产品推荐

