R语言提取predictors对应行位置时名称匹配赋值错误问题
R列表多数据框行位置提取与名称匹配问题
需求场景
现有存储多组数据的列表,每组数据中行位置由id字段标识。给定名称向量predictors,需要实现两个目标:
- 从列表的每个数据框中提取目标名称对应的行位置
- 将匹配到的原始名称作为提取结果的名称
当前已完成行位置提取逻辑,但无法为提取到的位置正确匹配对应的原始名称。
现有错误实现
predictors <- c('status', 'verbal') row_predictor_value <- lapply(row_predictor_data, function(x) which(x$name %in% predictors, arr.ind = TRUE) %>% setNames(., predictors))
运行结果
[[1]] status verbal 2 4 [[2]] status verbal 2 4 [[3]] status verbal 2 4
错误原因
setNames直接使用predictors的原始顺序为结果命名,没有和实际匹配到的行对应的名称对齐,导致名称和位置错配。
预期输出
[[1]] status verbal 2 4 [[2]] verbal status 2 4 [[3]] status verbal 2 4
可复现测试数据
row_predictor_data <- list(structure(list(id = structure(1:4, .Label = c("1", "2", "3", "4"), class = "factor"), name = structure(c(1L, 3L, 2L, 4L), .Label = c("(Intercept)", "income", "status", "verbal"), class = "factor")), class = "data.frame", row.names = c(NA, -4L)), structure(list(id = structure(1:4, .Label = c("1", "2", "3", "4"), class = "factor"), name = structure(c(1L, 4L, 2L, 3L), .Label = c("(Intercept)", "sex", "status", "verbal"), class = "factor")), class = "data.frame", row.names = c(NA, -4L)), structure(list(id = structure(1:5, .Label = c("1", "2", "3", "4", "5"), class = "factor"), name = structure(c(1L, 4L, 2L, 5L, 3L), .Label = c("(Intercept)", "income", "sex", "status", "verbal"), class = "factor")), class = "data.frame", row.names = c(NA, -5L)))
修复代码
问题核心是命名逻辑错误,不需要固定使用predictors的原始顺序命名,而是取匹配行位置对应的实际name字段值作为名称即可:
predictors <- c('status', 'verbal') row_predictor_value <- lapply(row_predictor_data, function(x) { match_pos <- which(x$name %in% predictors, arr.ind = TRUE) setNames(match_pos, as.character(x$name[match_pos])) })
运行上述代码即可得到和预期完全一致的结果,第二个列表元素会按照实际行顺序,将位置2命名为verbal、位置4命名为status,名称和行位置完全对应。
内容的提问来源于stack exchange,提问作者Emil11
相关产品推荐
相关产品推荐

