【问题标题】:How to write condition on minimal elements?如何在最小元素上写条件?
【发布时间】:2021-10-15 16:56:39
【问题描述】:

我有一个对角元素为零的对称矩阵:

set.seed(42)

m<-matrix(runif(25),5)
m[lower.tri(m)] = t(m)[lower.tri(m)]

diag(m)<-0
m


         [,1]      [,2]      [,3]      [,4]      [,5]
[1,] 0.0000000 0.5190959 0.4577418 0.9400145 0.9040314
[2,] 0.5190959 0.0000000 0.7191123 0.9782264 0.1387102
[3,] 0.4577418 0.7191123 0.0000000 0.1174874 0.9888917
[4,] 0.9400145 0.9782264 0.1174874 0.0000000 0.9466682
[5,] 0.9040314 0.1387102 0.9888917 0.9466682 0.0000000

除了每列中的最小元素外,我需要对对角线以下的所有元素添加 -1:

预期结果是:

         [,1]      [,2]      [,3]      [,4]      [,5]
[1,]  0.0000000 -1.0000000  -1.0000000 -1.0000000 -1.0000000
[2,] -1.0000000  0.0000000 -1.0000000 -1.0000000  -1.0000000
[3,]  0.4577418  -1.0000000  0.0000000  -1.0000000 -1.0000000
[4,] -1.0000000 -1.0000000  0.1174874  0.0000000  -1.0000000
[5,] -1.0000000  0.1387102 -1.0000000  0.9466682  0.0000000

我的尝试是:

for (i in 2:ncol(m)) 
#if (m[,i] > 0) 
x <- pmin(x, m[,i])
x


min = which(m == min(m), arr.ind = TRUE)  
min

问题。如何在对角元素上添加条件?

【问题讨论】:

  • 在您的示例输出中,您所追求的是令人困惑的地方:(1)所有元素期望每列中的最小值应该是-1 或(2)空间上低于对角线的所有元素应该是-1,除了最小值或(3)值低于诊断值0 的所有元素都应该是-1,除了最小值?
  • 为什么在您的预期输出中,第 2 列中的 0.5190959 设置为 -1
  • 我已经更新了输出

标签: r matrix min


【解决方案1】:

你可以试试这个……但我很确定有更简单的方法。

m_tmp <- m
m_tmp[upper.tri(m, diag = T)] <- NA

library(tidyverse)
m_tmp %>% 
  as.data.frame() %>% 
  rowid_to_column() %>% 
  pivot_longer(-1) %>% 
  group_by(name) %>% 
  mutate(val = sum(is.na(value))) %>%
  mutate(value = ifelse(val == 5, -1, value)) %>%
  mutate(value = ifelse(value == min(value, na.rm = T), value, -1)) %>%
  select(-val) %>% 
  filter(!is.na(value)) %>% 
  pivot_wider(names_from = "name", values_from = "value", values_fill = -1)  %>% 
  select(-1) %>% 
  as.matrix()
             V1         V2         V3         V4 V5
[1,]  0.0000000 -1.0000000 -1.0000000 -1.0000000 -1
[2,] -1.0000000  0.0000000 -1.0000000 -1.0000000 -1
[3,]  0.4577418 -1.0000000  0.0000000 -1.0000000 -1
[4,] -1.0000000 -1.0000000  0.1174874  0.0000000 -1
[5,] -1.0000000  0.1387102 -1.0000000  0.9466682  0

【讨论】:

    【解决方案2】:

    你可以这样做:

    m[!sweep(m, 2, apply(replace(m, upper.tri(m, diag = TRUE), Inf), 2, min), `==`)] <- -1
    
    `diag<-`(m, 0)
    
           [,1]       [,2]       [,3]       [,4] [,5]
    [1,]  0.0000000 -1.0000000 -1.0000000 -1.0000000   -1
    [2,] -1.0000000  0.0000000 -1.0000000 -1.0000000   -1
    [3,]  0.4577418 -1.0000000  0.0000000 -1.0000000   -1
    [4,] -1.0000000 -1.0000000  0.1174874  0.0000000   -1
    [5,] -1.0000000  0.1387102 -1.0000000  0.9466682    0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 2014-11-08
      • 2020-03-14
      • 1970-01-01
      • 2022-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多