在R语言中提取矩阵每行前n个正值列并生成新矩阵
R语言提取矩阵每行前2个正值的方法
首先,先复现题目中的具体矩阵(避免rnorm()的随机结果差异):
x_mat <- matrix( c( 0.4530790, -0.6345827, -0.09875488, -2.1310380, 1.2052932, 0.8857939, 1.7273651, -1.66136354, 1.2525782, 1.3527161, -0.2236681, 0.2938106, 0.45233337, 0.4916921, 1.0909765, 1.5959947, -0.9065362, -0.78020171, -1.0510121, 0.8550553, 0.1472118, 0.7305333, 0.87001933, -2.0218497, -0.7610662 ), nrow = 5, byrow = TRUE )
方法1:基础R的apply函数
这是最直接的基础R解决方案,逐行处理筛选:
# 提取每行前2个正值并转置为目标矩阵 result_mat <- t(apply(x_mat, 1, function(row) { positives <- row[row > 0] positives[1:2] })) # 输出结果 result_mat
运行后得到的结果与题目要求完全一致:
[,1] [,2] [1,] 0.4530790 1.2052932 [2,] 0.8857939 1.7273651 [3,] 0.2938106 0.4523334 [4,] 1.5959947 0.8550553 [5,] 0.1472118 0.7305333
方法2:tidyverse工具链(适合习惯tidy语法的用户)
如果常用tidyverse包,可以用行式处理实现:
library(tidyverse) result_tidy <- x_mat %>% as_tibble() %>% rowwise() %>% # 收集每行的所有正值 mutate(positives = list(c_across(everything())[c_across(everything()) > 0])) %>% # 提取前2个正值 mutate(first_pos = positives[[1]], second_pos = positives[[2]]) %>% select(first_pos, second_pos) %>% as.matrix() result_tidy
内容的提问来源于stack exchange,提问作者MAJ
相关产品推荐
相关产品推荐

