You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:26:27