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

如何在R中按行列号提取dataframe单元格值并生成新dataframe

R实现按指定列号提取值并生成新数据框

问题场景

你有一个超过10000行、14列的dataframe,其中Cl列存储了每行需要提取值的列号(例如第一行Cl值为5,对应提取第5列的数值),需要生成仅保留id列和提取值的新dataframe。

实现方案

以下提供两种高效的实现方式,适配大数据量场景:


1. 基础R方法(效率优先,适合大样本)

先构造示例数据框模拟你的场景:

# 构造示例数据(id为第一列,Cl存储目标列号)
set.seed(123)
df <- data.frame(
  id = 1:10,
  A = sample(1:100, 10),
  B = sample(1:100, 10),
  C = sample(1:100, 10),
  D = sample(1:100, 10),
  E = sample(1:100, 10),
  F = sample(1:100, 10),
  G = sample(1:100, 10),
  H = sample(1:100, 10),
  I = sample(1:100, 10),
  Cl = sample(2:10, 10, replace = TRUE) # Cl对应A-I的列号(2-10)
)

核心提取代码:

# 生成新数据框
new_df <- data.frame(
  id = df$id,
  extracted_value = df[cbind(1:nrow(df), df$Cl)]
)

原理:cbind(1:nrow(df), df$Cl)生成一个行号-列号的索引矩阵,直接通过矩阵索引从原数据框中提取每行对应列的数值,这种方法无需循环,效率极高,适合10000行以上的大样本。


2. tidyverse方法(代码更直观)

如果你习惯使用tidyverse生态,可以用以下代码:

library(dplyr)
library(purrr)

new_df <- df %>%
  mutate(extracted_value = map2_dbl(row_number(), Cl, ~ df[.x, .y])) %>%
  select(id, extracted_value)

或者使用rowwise语法:

new_df <- df %>%
  rowwise() %>%
  mutate(extracted_value = pick(all_of(Cl)) %>% pull()) %>%
  ungroup() %>%
  select(id, extracted_value)

注意事项

  • 确保Cl列的数值是有效的列号(范围在1到原数据框总列数之间),可以提前验证:
    stopifnot(all(df$Cl %in% 1:ncol(df)))
    
  • 若Cl列存储的是列名而非列号,只需将代码中的df$Cl替换为match(df$Cl, colnames(df))即可转换为列号。

内容的提问来源于stack exchange,提问作者genbio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:05:13