如何在R语言中重构数据框?附具体示例
解决方法:将每行非空值前置,补全空字符串
嘿,这需求很清晰——就是要把矩阵每行里的非空元素按原顺序挪到前面,剩下的位置补上空字符串对吧?我给你两种实现方式,base R的简洁版和tidyverse的灵活版,你可以按需选择:
Base R 快速实现
这是最直接的方法,用apply按行处理,配合自定义函数完成移位和补空:
# 先还原你的原始数据 v1 = c("DL1", "", "DL3", "DL4", "") v2 = c("DL1", "DL2", "DL3", "","DL5") v3 = c("DL1", "DL2", "DL3", "","DL5") v4 = c( "", "", "DL3", "","DL5") v5 = c( "", "", "", "","DL5") data1 = rbind(v1,v2,v3,v4,v5) # 定义处理单行的函数:提取非空值,补全空字符串到原长度 shift_non_empty <- function(row) { # 筛选出当前行的非空元素 non_empty_vals <- row[row != ""] # 拼接非空值 + 足够数量的空字符串 c(non_empty_vals, rep("", length(row) - length(non_empty_vals))) } # 按行应用函数,转置后得到目标矩阵 data2 <- t(apply(data1, 1, shift_non_empty)) # 保持原行名不变 rownames(data2) <- rownames(data1) # 查看结果 print(data2)
运行后你会得到完全符合要求的data2,每行的非空值都排在前面,后面补满空字符串。
Tidyverse 实现(适合复杂数据场景)
如果你平时习惯用tidyverse工具链,也可以用长表转宽表的思路来实现:
library(tidyverse) data2 <- data1 %>% # 把矩阵转成带行名的 tibble as_tibble(rownames = "row_id") %>% # 转成长表,方便筛选非空值 pivot_longer(-row_id, names_to = "old_col", values_to = "value") %>% # 过滤掉空值 filter(value != "") %>% # 按行分组,给非空值分配新的列位置 group_by(row_id) %>% mutate(new_col = str_c("V", row_number())) %>% # 转回宽表,空位置用空字符串填充 pivot_wider(names_from = new_col, values_from = value, values_fill = "") %>% ungroup() %>% # 移除行名列,补全到5列(原数据的列数) select(-row_id) %>% bind_cols(matrix("", nrow = nrow(.), ncol = 5 - ncol(.))) %>% # 还原原行名 `rownames<-`(rownames(data1)) print(data2)
这个方法更灵活,如果你的数据后续还有其他处理需求,用tidyverse的流程会更容易扩展。
内容的提问来源于stack exchange,提问作者Dare
相关产品推荐
相关产品推荐

