R语言如何迭代填充嵌套向量 提取数据框每行非零值对应列名
错误原因
你遇到的报错来自两个问题:
- 初始化的
v是普通原子向量,每个位置只能存储单个值,你尝试往v[i]中塞入由多个列索引拼接成的向量,长度不匹配触发报错 - 你写的判断条件
M[i,j] > 1和需求的「值不为0」不符,会漏掉值等于1的列
解决方案
下面两个方案都可以直接得到你要的输出格式,完全避免显式for循环:
tidyverse 方案(可读性高,易于扩展)
# 加载依赖包 library(dplyr) library(purrr) # 构造示例数据 M <- data.frame(x1=c(1,0,0), x2=c(0,5,5), x3=c(0,0,1), y=c(5, 0, 0), z=c(0,0,2)) # 新增v列 M <- M %>% mutate(v = pmap_chr(., ~{ # 提取当前行所有值不为0的列名 valid_cols <- names(c(...))[c(...) != 0] # 拼接为你需要的格式字符串 paste0("['", paste(valid_cols, collapse = "','"), "']") }))
基础R方案(无需安装第三方包)
M <- data.frame(x1=c(1,0,0), x2=c(0,5,5), x3=c(0,0,1), y=c(5, 0, 0), z=c(0,0,2)) M$v <- apply(M, 1, function(row) { valid_cols <- names(row)[row != 0] paste0("['", paste(valid_cols, collapse = "','"), "']") })
额外说明
如果你后续需要直接调用符合条件的列名,不需要存为字符串格式,可以直接生成列表列:
- tidyverse方案中把
pmap_chr改为pmap - 基础R方案中把
paste0那行替换为return(valid_cols),得到的v列每个元素都是列名字符串向量,可直接索引使用。
内容的提问来源于stack exchange,提问作者ncnc_2020
相关产品推荐
相关产品推荐

