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
相关产品推荐
相关产品推荐

