如何在R中移除NA并左移值以减少列数并重命名列
R数据集移位、去冗余列并重命名解决方案
原始数据集
df <- data.frame(path_finalcode = c(1, 2, 3, 4), `99210` = c("99210", NA, NA, NA), `102300` = c(NA, "102300", NA, NA), `1352816` = c(NA, NA, "1352816", NA), `1810151` = c(NA, "1810151", NA, NA))
实现方法
方法一:Base R 实现
无需额外安装包,用基础函数即可完成:
# 分离标识列和数据列 data_part <- df[, -1] # 按行提取非NA值,统一补NA到最长行的长度 shifted_data <- t(apply(data_part, 1, function(row) { non_na_vals <- row[!is.na(row)] # 补NA到最大非NA值数量的长度 length(non_na_vals) <- max(sapply(data_part, function(col) sum(!is.na(col)))) non_na_vals })) # 合并标识列和处理后的数据,并重命名列 result_df <- cbind(df[, 1, drop = FALSE], as.data.frame(shifted_data)) colnames(result_df)[-1] <- paste0("col", seq_len(ncol(result_df)-1))
方法二:Tidyverse 实现
用dplyr和tidyr包,代码更简洁易读:
library(dplyr) library(tidyr) result_df <- df %>% rowwise() %>% # 每行提取非NA值存为列表 mutate(temp = list(na.omit(c_across(-path_finalcode)))) %>% ungroup() %>% # 确定需要保留的最大列数 mutate(max_col_num = max(lengths(temp))) %>% # 给每行的列表补NA到最大长度 mutate(temp = map(temp, ~ c(., rep(NA, max_col_num - length(.))))) %>% # 把列表展开为多列 unnest_wider(temp, names_sep = "") %>% # 移除临时计算的列 select(-max_col_num) %>% # 重命名数据列为col1、col2... rename_with(~ paste0("col", seq_along(.)), -path_finalcode)
最终结果
运行上述代码后,得到的result_df即为期望的数据集:
result_df # path_finalcode col1 col2 # <dbl> <chr> <chr> # 1 1 99210 NA # 2 2 102300 1810151 # 3 3 1352816 NA # 4 4 NA NA
内容的提问来源于stack exchange,提问作者ltong
相关产品推荐
相关产品推荐

