R语言DataFrame列处理:按唯一值重组行,匹配列填充对应值
需求实现方案
示例输入数据
A <- c('ABC','GHI',rep(NA,3)) B <- c('AAB','ABC','BCE','CAB',NA) C <- c('ABC','BCE','GHI','XXX','ZZZ') D <- c('BCE',rep(NA,4)) E <- c('GHI','ZZZ','BAR',rep(NA,2)) df <- data.frame(A,B,C,D,E)
原DataFrame输出:
A B C D E 1 ABC AAB ABC BCE GHI 2 GHI ABC BCE <NA> ZZZ 3 <NA> BCE GHI <NA> BAR 4 <NA> CAB XXX <NA> <NA> 5 <NA> <NA> ZZZ <NA> <NA>
期望输出
A B C D E 1 ABC ABC ABC NA NA 2 GHI NA GHI NA GHI 3 NA AAB NA NA NA 4 NA BCE BCE BCE NA 5 NA NA ZZZ NA ZZZ 6 NA NA XXX NA NA 7 NA NA NA NA BAR 8 NA CAB NA NA NA
实现思路
- 提取整个DataFrame中的所有唯一非NA值,作为输出每行对应的核心标识值
- 针对每个唯一值,遍历原DataFrame的每一列:若该值在列中出现过,则填充该值;否则填充NA
- 将遍历结果整理为标准DataFrame格式
R代码实现
# 获取所有唯一非NA值 unique_vals <- unique(unlist(df)[!is.na(unlist(df))]) # 生成每行的结果 result_list <- lapply(unique_vals, function(val) { sapply(df, function(col) { if(val %in% col) val else NA_character_ }) }) # 转换为DataFrame并去除行名 result_df <- do.call(rbind, result_list) rownames(result_df) <- NULL # 查看最终结果 print(result_df)
运行后输出结果与期望一致,行顺序可根据需求自行调整排序规则。
内容的提问来源于stack exchange,提问作者Adamm
相关产品推荐
相关产品推荐

