R语言批量合并多列数据为username、X两列的实现方法
宽表堆叠高效实现方案
你需要的多列按行匹配用户名堆叠、过滤空值的操作,属于典型的宽表转长表场景,不需要逐列手动拼接,以下两种方案都可以秒级完成处理,结果和你手动逐列处理的逻辑完全一致。
方案1:tidyverse 实现(推荐,代码最简洁)
借助dplyr和tidyr的向量化操作,不需要写循环,核心逻辑几行就能完成处理:
library(tidyverse) df_final <- df2 %>% pivot_longer( cols = -username, # 除username外所有X、X.1~X.48列全部参与堆叠 values_to = "X", # 堆叠后的值列统一命名为X values_drop_na = TRUE # 自动剔除值为NA的行 ) %>% filter(X != "") %>% # 额外剔除空字符串的行,和你原有判断逻辑对齐 select(username, X) # 仅保留需要的两列
方案2:base R 循环实现(无需安装第三方包)
如果不想额外加载工具包,可以直接写for循环遍历所有目标列,逻辑和你手动处理的步骤完全对齐:
# 获取所有需要堆叠的列名(排除第一列username) target_cols <- colnames(df2)[-1] # 初始化空结果表,注意如果X列是数值类型,把character()替换成numeric() df_final <- data.frame( username = character(), X = character(), stringsAsFactors = FALSE ) for (cur_col in target_cols) { # 筛选当前列非NA、非空字符串的有效行 valid_flag <- !is.na(df2[[cur_col]]) & df2[[cur_col]] != "" # 提取有效行对应的用户名和当前列值 temp_data <- data.frame( username = df2$username[valid_flag], X = df2[[cur_col]][valid_flag], stringsAsFactors = FALSE ) # 追加到结果表 df_final <- rbind(df_final, temp_data) }
小提示:如果数据量超过10万行,优先用方案1,
pivot_longer的运行效率比手写rbind循环高10~100倍,不会出现内存占用过高、运行卡顿的问题。
内容的提问来源于stack exchange,提问作者jiesheng Chai
相关产品推荐
相关产品推荐

