R如何删除数据框每行的NA单元格并左移对齐保留有效内容
实现方案
基础R实现(无需安装额外包)
该方法适配任意列数的数据框,同时兼容你示例中字符串形式的"NA"和R原生NA值:
# 构造示例数据 df1 <- data.frame(F1=c(1,5,"NA",9),F2=c(2,5,"a","NA"),F3=c(1,"NA","o","NA")) # 定义行对齐处理函数 align_left <- function(row) { # 过滤当前行的无效值 valid_items <- row[!is.na(row) & row != "NA"] # 补空值到原数据框的列数,保持列数一致 c(valid_items, rep("", length(row) - length(valid_items))) } # 逐行应用函数后转置为数据框,保留原列名 df2 <- as.data.frame(t(apply(df1, 1, align_left))) colnames(df2) <- colnames(df1)
运行后输出结果完全符合要求:
> df2 F1 F2 F3 1 1 2 1 2 5 5 3 a o 4 9
如果你的实际数据中是R原生逻辑NA,不是字符串格式的"NA",只要把过滤条件简化为valid_items <- row[!is.na(row)]即可。
tidyverse实现(适合tidy生态用户)
library(tidyverse) df2 <- df1 %>% rowwise() %>% summarise( valid = list(c_across(everything())[!is.na(c_across(everything())) & c_across(everything()) != "NA"]), .groups = "drop" ) %>% unnest_wider(valid, names_sep = "_") %>% rename_with(~colnames(df1), starts_with("valid_")) %>% mutate(across(everything(), ~replace_na(., "")))
内容的提问来源于stack exchange,提问作者Tanya Valkanova
相关产品推荐
相关产品推荐

