如何按行索引与列索引的组合提取data.frame中的对应值?
高效提取data.frame中指定行列组合对应的值
我有一个名为df的data.frame,结构如下:
structure(list(GWeek = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), Team1 = c(33, 24, 30, 18, 31, 37, 26, 35, 19, 22), Team2 = c(21, 24, 33, 21, 28, 23, 28, 32, 24, 26), Team3 = c(25, 30, 27, 21, 35, 26, 28, 25, 29, 33), Team4 = c(30, 29, 28, 21, 33, 18, 17, 29, 32, 27), Team5 = c(12, 18, 31, 21, 41, 30, 27, 31, 18, 24), Team6 = c(30, 23, 31, 27, 35, 21, 24, 41, 43, 24)), class = "data.frame", row.names = c(NA, -10L))
显示效果为:
GWeek Team1 Team2 Team3 Team4 Team5 Team6 1 1 33 21 25 30 12 30 2 2 24 24 30 29 18 23 3 3 30 33 27 28 31 31 4 4 18 21 21 21 21 27 5 5 31 28 35 33 41 35 6 6 37 23 26 18 30 21 7 7 26 28 28 17 27 24 8 8 35 32 25 29 31 41 9 9 19 24 29 32 18 43 10 10 22 26 33 27 24 24
需要从该表中提取部分值组成向量,这些值由两个向量的组合指定:
# 行索引 r.idx <- c(4,5,6,9,10) # 列索引 c.idx <- c("Team5", "Team3", "Team6", "Team4", "Team2")
即需要获取以下位置的值:
df[4,"Team5"], df[5,"Team3"], df[6,"Team6"], df[9,"Team4"], df[10, "Team2"]
由于数据集规模较大,且组合数量非常多,需要一种高效方法提取df中对应r.idx第i个元素(行)与c.idx第i个元素(列)位置的值。
高效解决方案
方法1:矩阵索引(原生最快捷)
这是R处理此类需求效率最高的方法,尤其适配大数据集:
# 将列名转换为列位置索引 col_pos <- match(c.idx, colnames(df)) # 构造(row, col)形式的索引矩阵 idx_matrix <- cbind(r.idx, col_pos) # 直接提取对应值 result <- df[idx_matrix]
运行后result即为目标向量:[1] 21 35 21 32 26
方法2:tidyverse风格实现
如果习惯使用tidyverse生态,可通过以下方式实现,小数据集下效率差异可忽略:
library(dplyr) tibble(r = r.idx, c = c.idx) %>% rowwise() %>% mutate(value = df[r, c]) %>% pull(value)
输出结果同样为:[1] 21 35 21 32 26
方法3:循环(不推荐大数据集)
循环方式效率极低,仅作参考:
result <- numeric(length(r.idx)) for(i in seq_along(r.idx)){ result[i] <- df[r.idx[i], c.idx[i]] }
内容的提问来源于stack exchange,提问作者R18
相关产品推荐
相关产品推荐

