Reputation: 99
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
Upvotes: 3
Views: 2116
Reputation: 99371
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"
Upvotes: 0
Reputation: 887851
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"
Upvotes: 2
Reputation: 32558
Run sapply
over columns and find min
and then check if the min
meets your condition.
colnames(DF)[sapply(DF, min) <= 2]
#[1] "V3"
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"
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
Upvotes: 3