如何使用索引矩阵从tibble中检索对应条目?
使用索引矩阵对tibble进行子集化的替代方法
当用行-列索引矩阵对data.frame做子集化时可以正常工作,但同样的操作在tibble上会触发错误,提示矩阵下标必须为逻辑型。你不需要每次都把tibble转回data.frame,以下是几种直接的解决方案:
问题复现
set.seed(1) df <- data.frame(a= letters[1:10], b= LETTERS[1:10]) sm <- matrix(c(sample(1:10, 3, replace= TRUE), sample(1:2, 3, replace= TRUE)), ncol= 2) # data.frame 正常输出 df[sm] #> [1] "i" "D" "g" # tibble 报错 df_tibble <- tibble::as_tibble(df) df_tibble[sm] #> Error in df_tibble[sm]: ! Subscript sm is a matrix, it must be of type logical.
解决方案1:转成矩阵后索引
tibble不支持矩阵下标,但可以先将其转为矩阵,再用索引矩阵取值,结果和data.frame完全一致:
as.matrix(df_tibble)[sm] #> [1] "i" "D" "g"
解决方案2:拆分索引后逐元素提取
把索引矩阵拆成行号和列号,用map2逐对提取对应位置的元素:
library(purrr) rows <- sm[, 1] cols <- sm[, 2] map2_chr(rows, cols, ~ df_tibble[.x, .y, drop = TRUE]) #> [1] "i" "D" "g"
解决方案3:转换为线性索引
data.frame处理矩阵下标时,本质是将其转换为线性索引。你可以手动计算线性索引后,用[[提取元素:
linear_idx <- sm[,1] + (sm[,2]-1)*nrow(df_tibble) df_tibble[[linear_idx]] #> [1] "i" "D" "g"
为什么tibble不支持矩阵下标?
tibble的设计更注重明确性,避免data.frame中一些隐式的、容易混淆的行为(比如矩阵下标自动转线性索引)。因此默认只允许逻辑型矩阵作为下标,其他类型的矩阵下标会被拒绝。
内容的提问来源于stack exchange,提问作者LulY
相关产品推荐
相关产品推荐

