Заменить все значения в матрице <0.1 на 0 - PullRequest
48 голосов
/ 25 февраля 2012

У меня есть матрица (2601 на 58) оценок концентрации твердых частиц из модели качества воздуха.Поскольку реальные мониторы качества воздуха не могут измерять ниже 0,1 мкг / л, мне нужно заменить все значения в моей матрице, которые <0.1, нулевым значением / NA / нулевым значением.

Кто-то предложил ifelse(test, true, false) с логическим утверждением, но когда я попробую это, он удалит все.

Ответы [ 6 ]

65 голосов
/ 25 февраля 2012
X[X < .1] <- 0

(или NA, хотя 0 звучит более подходящим в этом случае.)

Матрицы - это просто векторы с измерениями, поэтому вы можете обращаться с ними как с вектором, когда назначаете их.В этом случае вы создаете логический вектор над X, который указывает малые значения, и он присваивает правую часть каждому элементу TRUE.

54 голосов
/ 25 февраля 2012

ifelse должно работать:

mat <- matrix(runif(100),ncol=5)
mat <- ifelse(mat<0.1,NA,mat)

Но я бы выбрал ответ Харлана вместо моего.

mat[mat < 0.1] <- NA
1 голос
/ 06 декабря 2012

Я думаю, вы обнаружите, что ifelse не является векторной операцией (она фактически выполняется в виде цикла), и поэтому она на несколько порядков медленнее, чем векторный эквивалент.R предпочитает векторные операции, поэтому применять, mapply, sapply молниеносно для некоторых вычислений.

Небольшие наборы данных, не проблема, но если у вас есть массив длиной 100 КБ или более, вы можете пойти и приготовитьжареный ужин до его завершения любым методом, включающим цикл.

Код ниже должен работать.

Для вектора

minvalue <- 0
X[X < minvalue] <- minvalue

Для Dataframe или Matrix.

minvalue <- 0
n <- 10 #change to whatever.
columns <- c(1:n)
X[X[,columns] < minvalue,columns] <- minvalue

Другой быстрый метод, с помощью функций pmax и pmin, ограничивает записи от 0 до 1, и вы можете поместить матрицу или фрейм данных в качестве первого аргумента без проблем.

ulbound <- function(v,MAX=1,MIN=0) pmin(MAX,pmax(MIN,v))
1 голос
/ 21 июня 2012

Решение data.frame:

if(!require(plyr)){
    install.packages("plyr")}

rm.neg<-colwise(function(x){
  return(ifelse(x < 0.1, 0, x))})

rm.neg(data.frame(mat))

PS: код для rm.neg можно извлечь и упростить, чтобы не нуждаться в вызове plyr, который используется для создания функции colwise.

1 голос
/ 04 марта 2012

Другие эквивалентные методы:

let:

M=matrix(rnorm(10*10), 10, 10)

Грубая сила (обучающая)

for (i in 1:nrow(M)) {
    for (j in 1:ncol(M)) if (M[i,j]<0.1 & !is.na(M[i,j]) ) M[i,j]=NA
    }

Если в M отсутствуют значения (NA), пропустить!is.na выдаст ошибки.

Другой способ: использование recode в пакете car:

library(car)
recode(M, "lo:0.099999=NA")

Здесь нельзя указать строгое неравенство, поэтому есть кучаиз 9. Положите больше девяток, и он превращается в 0,1.lo - это удобство перекодирования, которое дает минимальное значение (удаление NA).

1 голос
/ 25 февраля 2012

Просто, чтобы предоставить (на мой взгляд) интересную альтернативу:

Если вам нужно зафиксировать значения, чтобы они никогда не были меньше значения, вы можете использовать pmax:

set.seed(42)
m <- matrix(rnorm(100),10)

m <- pmax(m, 0) # clamp negative values to 0

... Это не совсем работает в вашем случае, так как вы хотите, чтобы значения <0,1 стали 0. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...