R语言如何对指定列分组执行na.omit移除NA后拼接为新data.frame
实现代码
首先定义你提供的原始数据和列组配置:
# 原始数据框 df <- structure(list(col1 = 1:9, col2 = c(NA, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L), col3 = c(1L, 2L, NA, 4L, 5L, 6L, 7L, 8L, 9L), col4 = c(1L, 2L, 3L, NA, 5L, 6L, 7L, 8L, 9L), col5 = c(1L, 2L, 3L, 4L, NA, 6L, 7L, 8L, 9L), col6 = c(1L, 2L, 3L, 4L, 5L, NA, 7L, 8L, 9L), col7 = c(1L, 2L, 3L, 4L, 5L, 6L, NA, 8L, 9L), col8 = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, NA, 9L), col9 = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, NA), col10 = 1:9), class = "data.frame", row.names = c(NA, -9L)) # 列组配置列表 data_list <- list(c(1:3),c(4:6),c(7:10))
基础R实现
不需要额外安装依赖:
# 计算所有列组去NA后的最大行数,作为统一输出长度 max_len <- max(sapply(data_list, function(cols) nrow(na.omit(df[, cols])))) # 逐组处理后按列拼接 result <- do.call(cbind, lapply(data_list, function(cols) { sub_df <- na.omit(df[, cols]) # 不足最大长度的部分补NA if (nrow(sub_df) < max_len) { na_pad <- as.data.frame(matrix(NA, nrow = max_len - nrow(sub_df), ncol = length(cols))) colnames(na_pad) <- colnames(sub_df) sub_df <- rbind(sub_df, na_pad) } sub_df })) # 重置行名 rownames(result) <- NULL
Tidyverse实现
语法更简洁:
library(tidyverse) # 计算统一输出长度 max_len <- map_dbl(data_list, ~nrow(na.omit(df[.]))) |> max() # 逐组处理拼接 result <- map_dfc(data_list, function(cols) { na.omit(df[cols]) |> add_row(.after = nrow(.), .n = max_len - nrow(.)) })
运行后得到的result和你提供的预期输出完全一致,可通过identical(result, 预期数据变量名)验证结果正确性。
内容的提问来源于stack exchange,提问作者GOGA GOGA
相关产品推荐
相关产品推荐

