【问题标题】:Returning Column Name from Matrix based on value in R根据 R 中的值从矩阵返回列名
【发布时间】:2017-03-10 20:44:04
【问题描述】:

我有一个矩阵,我想根据值提取列名。在这种情况下,我想要包含值小于或等于 2 的任何列的名称(无论该值位于哪一行)。

set.seed(42)
DF <- matrix(sample(1:9,9),ncol=3,nrow=3)
DF <- as.data.frame.matrix(DF)

这是我尝试过的,(如果矩阵中只有 1 行,它似乎可以工作)

test<-colnames(DF)[which(DF<=2),]

test 然后表示包含值 的列名

【问题讨论】:

  • 我也试过'test

标签: r matrix


【解决方案1】:

1

在列上运行sapply 并找到min,然后检查min 是否满足您的条件。

colnames(DF)[sapply(DF, min) <= 2]
#[1] "V3"

2

您也可以在列(MARGIN = 2)上运行apply,查看每列中的any值是否满足要求的条件

colnames(DF)[apply(DF, MARGIN = 2, function(a) any(a<=2))]
#[1] "V3"

3

arr.ind = TRUEwhich 一起使用。这将给出满足which 条件的值的索引。从中提取列信息[,2]

unique(colnames(DF)[which(DF<=2, arr.ind = TRUE)[,2]])
#[1] "V3"

数据

set.seed(42)
DF <- matrix(sample(1:9,9),ncol=3,nrow=3)
DF <- as.data.frame.matrix(DF)
DF
#  V1 V2 V3
#1  9  5  6
#2  8  4  1
#3  3  7  2

【讨论】:

  • thanks@d.b 有没有办法让每个列名只返回一次?
  • 或者另一个选项是unique(names(DF)[col(DF)*(DF &lt;= 2)])# [1] "V3"
【解决方案2】:

我们也可以使用matrixStats中的colMins/rowMins

library(matrixStats)
names(DF)[rowMins(t(DF))<=2]
#[1] "V3"

或者使用tidyverse

library(dplyr)
DF %>% 
    summarise_each(funs(min(.) <=2)) %>% 
    unlist %>% 
    names(.)[.]
#[1] "V3"

【讨论】:

    【解决方案3】:

    我们不需要任何apply 循环。在条件DF &lt;= 2 上使用时,我们可以取col() 的结果的唯一值。

    names(DF)[unique(col(DF)[DF <= 2])]
    # [1] "V3"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-26
      • 2023-03-24
      • 2014-11-20
      • 2016-10-31
      • 1970-01-01
      • 2020-07-14
      • 2014-09-18
      • 2021-05-18
      相关资源
      最近更新 更多