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

R语言中如何根据列名规则重排数据框的行值

R语言按列名规则重排数据框值实现方法

核心逻辑:原始数据中Q4_前缀列存储的数值,本身对应该值需要归属的列后缀编号,只需要逐行把值匹配到对应编号的列位,其余位置留空即可。

  • 基础R实现(无需安装第三方包)
    首先构造和你给出结构完全一致的测试数据:
# 原始测试数据
df <- data.frame(
  ID = 1:4,
  Q4_1 = c(4, 1, 3, 5),
  Q4_2 = c(3, 3, 1, NA),
  Q4_3 = c(1, NA, 2, NA),
  Q4_4 = c(NA, NA, NA, NA),
  Q4_5 = c(NA, NA, NA, NA)
)

运行处理代码:

# 提取所有Q4前缀的列
q4_cols <- grep("^Q4_", names(df), value = TRUE)
# 初始化空结果矩阵
q4_res <- matrix(NA, nrow = nrow(df), ncol = length(q4_cols), dimnames = list(NULL, q4_cols))

# 逐行匹配值到对应列
for (i in 1:nrow(df)) {
  valid_vals <- na.omit(unlist(df[i, q4_cols]))
  q4_res[i, paste0("Q4_", valid_vals)] <- valid_vals
}

# 合并ID列得到最终结果
final_df <- cbind(ID = df$ID, as.data.frame(q4_res))

如果需要空值不显示NA、和你给出的示例展示效果完全一致,加一行替换即可:

final_df[is.na(final_df)] <- ""

打印结果核对:

ID Q4_1 Q4_2 Q4_3 Q4_4 Q4_5
1  1         3    4
2  2         3
3  3    2    3
4  4                   5
  • tidyverse实现(适合习惯用流处理语法的场景)
library(dplyr)
library(tidyr)

q4_cols <- grep("^Q4_", names(df), value = TRUE)

final_df <- df |> 
  pivot_longer(cols = starts_with("Q4_"), values_drop_na = TRUE) |> 
  mutate(target_col = paste0("Q4_", value)) |> 
  pivot_wider(names_from = target_col, values_from = value) |> 
  select(ID, all_of(q4_cols)) |> 
  replace(is.na(.), "")

运行后得到的结果和基础R方法完全一致。

注意:如果你的原始数据空值不是NA而是空字符串,只需要把代码里判断na.omit、is.na的部分改成判断值不等于空字符串即可,逻辑完全通用。

内容的提问来源于stack exchange,提问作者CHONG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.08 16:15:17