问题
I have a matrix that I want to extract column names based on the value. In this case I want the name of any column that contains a value less than or equal to 2 (doesnt matter what row that value is located in).
set.seed(42)
DF <- matrix(sample(1:9,9),ncol=3,nrow=3)
DF <- as.data.frame.matrix(DF)
this is what I have tried, (it seems to work if there is only 1 row in the matrix)
test<-colnames(DF)[which(DF<=2),]
test would then represent the column names containing values <= 2
回答1:
1
Run sapply over columns and find min and then check if the min meets your condition.
colnames(DF)[sapply(DF, min) <= 2]
#[1] "V3"
2
You can also run apply on columns (MARGIN = 2) to see if any value in each column meets the required condition
colnames(DF)[apply(DF, MARGIN = 2, function(a) any(a<=2))]
#[1] "V3"
3
Use arr.ind = TRUE with which. This will give the indices of the values that meet the condition of which. From that, extract the column information [,2].
unique(colnames(DF)[which(DF<=2, arr.ind = TRUE)[,2]])
#[1] "V3"
DATA
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
回答2:
We can also use colMins/rowMins from matrixStats
library(matrixStats)
names(DF)[rowMins(t(DF))<=2]
#[1] "V3"
Or using tidyverse
library(dplyr)
DF %>%
summarise_each(funs(min(.) <=2)) %>%
unlist %>%
names(.)[.]
#[1] "V3"
回答3:
We don't need any apply loops. We can take the unique values of the result of col() when used on the condition DF <= 2.
names(DF)[unique(col(DF)[DF <= 2])]
# [1] "V3"
来源:https://stackoverflow.com/questions/42727397/returning-column-name-from-matrix-based-on-value-in-r