如何高效合并数据框非NA值对应的行名与列名?
高效提取数据框中非NA值的行名列名组合
针对大数据量的场景,推荐以下几种高效实现方式,均避免了低效的循环操作:
1. Base R 原生方法(无需额外安装包)
利用which()函数的向量化特性快速定位非NA值的位置,再提取对应的行名和列名:
# 定位所有非NA值的行列索引 non_na_pos <- which(!is.na(df1), arr.ind = TRUE) # 生成目标数据框 df2 <- data.frame( number = colnames(df1)[non_na_pos[, "col"]], site = rownames(df1)[non_na_pos[, "row"]], stringsAsFactors = FALSE )
这个方法依赖R原生函数,内存占用低,处理速度快,适合不想引入第三方包的场景。
2. data.table 方法(超大数据集首选)
data.table专为大数据处理优化,内存使用更高效,操作速度显著优于原生方法和tidyverse,适合百万级以上行/列的数据集:
library(data.table) # 将原生数据框转换为data.table,保留行名为site列 setDT(df1, keep.rownames = "site") # 宽表转长表后过滤NA值,保留目标列 df2 <- melt(df1, id.vars = "site", variable.name = "number")[, .(number, site)][!is.na(value)]
3. tidyverse 方法(代码可读性强)
如果习惯tidyverse的语法风格,这个方法代码更直观,处理中等规模数据效率足够:
library(tidyverse) df2 <- df1 %>% rownames_to_column("site") %>% # 将行名转为单独列 pivot_longer(-site, names_to = "number") %>% # 宽表转长表 drop_na(value) %>% # 过滤NA值 select(number, site) # 保留目标列
验证结果
运行上述任意方法后,生成的df2都会与你预期的结果一致:
> df2 number site 1 number1 siteA 2 number1 siteC 3 number2 siteC 4 number3 siteA 5 number3 siteB
内容的提问来源于stack exchange,提问作者Lieke
相关产品推荐
相关产品推荐

