R语言:提取矩阵每行非零值生成新对象的报错求助
问题分析与解决方法
嗨,我来帮你拆解一下这个报错的原因,再给你两个实用的解决办法!
为啥会报错?
你写的代码里,一开始把zz_new_create初始成了一个空列表(list()),但在循环里却用了zz_new_create[i, ii]这种矩阵/数据框专属的二维下标来赋值。列表本质是一维结构,不支持这种二维索引方式,所以才会弹出incorrect number of subscripts on matrix的错误~
办法一:修正你的循环逻辑
如果想保留循环的思路,咱们可以调整初始化和赋值的方式,不用嵌套遍历列,直接提取每行的非零值即可:
# 先初始化一个和原矩阵行数一致的空列表 zz_new_create <- vector("list", nrow(zz_new)) for (i in 1:nrow(zz_new)) { # 提取当前行所有大于0的值 non_zero_vals <- zz_new[i, ][zz_new[i, ] > 0] # 把这些值存入列表对应的位置(注意用双括号[[i]]访问列表元素) zz_new_create[[i]] <- non_zero_vals } # 把结果合并到原矩阵,转成数据框(因为矩阵不能存向量类型的列) zz_new_result <- cbind(as.data.frame(zz_new), New_Variable = I(zz_new_create))
这里的I()函数是为了让数据框保留向量类型的列,不会把向量拆成多个单独的列。
办法二:用apply一行搞定(更推荐)
R里处理行/列批量操作,apply函数比循环更简洁高效,一行代码就能完成你的需求:
# 对原矩阵的每一行应用函数,提取所有非零值 new_variable <- apply(zz_new, 1, function(x) x[x > 0]) # 把原矩阵转成数据框,再添加New_Variable列 zz_new_result <- as.data.frame(zz_new) zz_new_result$New_Variable <- I(new_variable)
验证一下结果
咱们可以看看关键行的输出是否符合预期:
# 第一行的非零值 zz_new_result$New_Variable[[1]] # 输出: [1] 5 25 # 第六行的非零值 zz_new_result$New_Variable[[6]] # 输出: [1] 5 10 20 25
完全满足你要的效果,而且原矩阵的所有列都完整保留了~
内容的提问来源于stack exchange,提问作者Prometheus
相关产品推荐
相关产品推荐

