我的矩阵如下:
> Mat=matrix(c(1,1,0,1,1,2,1,Inf), nrow=4, ncol=2)
> Mat
[,1] [,2]
[1,] 1 1
[2,] 1 2
[3,] 0 1
[4,] 1 Inf
我想基于上述矩阵创建一个新矩阵,如下所示:当第一列的值等于第二列时,将相同的值放在新矩阵的第一列中,当我们有两个不同的值时在两列中,将新矩阵的第一列的两个值的平均值放入,而当第二列的值为Inf时,将第一列的值放入新矩阵的第一列中。对于新矩阵的第二列值,仅当第一个矩阵中的第二列的值是Inf时,才将该值等于0,否则等于1。最后一个新矩阵如下:
> newMat=matrix(c(1,1.5,0.5,1, 1,1,1,0), nrow=4,ncol=2)
> newMat
[,1] [,2]
[1,] 1.0 1
[2,] 1.5 1
[3,] 0.5 1
[4,] 1.0 0
如何在R中创建新矩阵?
答案 0 :(得分:2)
我们可以使用
Mat[,1] <- rowMeans(Mat)
i1 <- is.infinite(Mat[,2])
Mat[,2] <- +(!i1)
Mat[i1,1] <- 1
答案 1 :(得分:1)
扩展示例数据以说明inf在第一列中的情况;
m <- matrix(c(1, 1, 0, 1, Inf, 1, 2, 1, Inf, 1), ncol=2)
m
[,1] [,2]
[1,] 1 1
[2,] 1 2
[3,] 0 1
[4,] 1 Inf
[5,] Inf 1
使用基数R
的解决方案:
1。将m
复制到new_m
m_new <- m
2。确定需要更改值的行:
different_values <- m[, 1] != m[, 2]
second_is_inf <- is.infinite(abs(m[, 2]))
3。应用更改:
m_new[different_values & !second_is_inf, 1] <- rowSums(m[different_values & !second_is_inf, 1:2])/2
m_new[second_is_inf, 2] <- 0
m_new
返回:
[,1] [,2]
[1,] 1.0 1
[2,] 1.5 2
[3,] 0.5 1
[4,] 1.0 0
[5,] Inf 1