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

如何高效合并数据框非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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:27:08