2016-02-10 3 views
2

Я только начал изучать R и мне нужна помощь.Найти второе самое низкое ненулевое значение в R

Я хотел бы найти наименьшее ненулевое число в определенных столбцах, но если самое низкое число равно нулю, то я хотел бы иметь второе наименьшее число.

Мой код выглядит следующим образом на данный момент:

aggregate(M3klar2[,32:35],M3klar2["ID"], function(x) if(min(x)>0) min(x) else if(min(x==0) ??second lowest??) 

Что я должен писать после if(min(x==0))? Или любые другие предложения?

+2

Добро пожаловать в stackoverflow. Пройдите экскурсию и ознакомьтесь с разделом справки. Введите код в раздел кода. Кроме того, каков текущий результат кода и что вы пробовали. –

+2

Немного взломанный подход будет 'min (x [!! x])' –

ответ

0
x <- c(0,0,2,3,4,5,6) 
min(setdiff(x,0)) 
# [1] 2 

будет выбрать наименьшее значение в векторе ПОСЛЕ 0.

+0

Это не сработало :(Вы имеете в виду, что я должен написать это после if (min (x == 0))? – Cham

+0

Вы также можете использовать 'sort (unique (x)) [2]' – Jimbou

+0

@Jimbou исправил это. –

3

Вам не нужно if заявление.

x <- c(0,0,2,3,4,5,6) 
> min(x[x > 0]) 
[1] 2 

Чтобы применить к определенным столбцам (как это было предложено @Stephen Henderson)

apply(df[,my.choice],2, min(x[x > 0])) 

В качестве альтернативы, если у вас также есть отрицательные числа, вы можете заменить x>0 с x!=0 (Разъяснение дается @docendo discimus)

+1

.. Так что я думаю, что он хочет применить это для определенных столбцов «apply» (df [, my.choice], 2, min (x [x> 0])) ' –

+0

Да точно в определенных столбцах И также для каждого человека по« ID ». Поскольку тот же самый человек появляется на более чем одна строка. – Cham

+1

Наименьшее ненулевое число не обязательно равно наименьшему числу _positive_ (т.е. I woul d предложите использовать 'min (x [x! = 0])') вместо –

Смежные вопросы